Statyczna analiza kodu - NCover, Fxcop, Cecil, Gendarme
Transkrypt
Statyczna analiza kodu - NCover, Fxcop, Cecil, Gendarme
Statyczna analiza kodu NCover, Fxcop, Cecil, Gendarme Piotr Domagalski Marcin Erdmann 14 stycznia 2008 Plan wykładu 1 Statyczna analiza kodu 2 NCover 3 FxCop 4 Cecil 5 Gendarme Statyczna analiza kodu Analiza kodu programu bez jego uruchamiania w odróżnieniu od dynamicznej analizy Możliwa do wykonania na kodzie źródłowym lub pewnej formie binarnej Dotyczy często popełnianych, najcześciej łatwych do wykrycia (automatycznie) błędów NCover - Funkcjonalność Badanie pokrycia kodu przez metody testujące Prosty profiling poprzez sprawdzenie, które linie kodu są najczęściej wywoływane Możliwość wykluczenia z badania pokrycia wybranych metod i klas przy użyciu atrybutów Brak konieczności specjalnego przygotowywania kodu do badania NCover - Produkt Wydawany przez Gnoso Inc., jako ich jedyny produkt Obecnie wersja 2.0.3 Rozwijany od 4 lat (wg strony producenta) Licencja komercyjna Professional Edition $149 Enterpise Edition $299 Darmowa licencja testowa na 30 dni NCover - Użycie NCover.Console Narzędzie konsolowe Generuje plik XML z wynikami badania NCoverExplorer Narzędzie graficzne Wyświetla wyniki badań w postaci graficznej Może wczytać plik XML wygenerowany przez NCover.Console w celu łatwiejszej analizy Co pokażemy Badanie ile procent kodu jest pokryte przez testy przy użyciu NCoverExplorer Stworzenie atrybutu, który powoduje wykluczenie metody z badania FxCop - Funkcjonalność Umożliwia sprawdzenie czy kod napisany przez nas jest zgodny ze zbiorem ściśle określonych reguł Domyślnie posiada ponad 200 reguł podzielonych na 10 grup Możliwe jest dopisanie własnych reguł FxCop - Grupy reguł Design Globalization Interoperability Mobility Naming Performance Portability Security FxCop - Produkt Wydany przez Microsoft Licencja umożliwia bezpłatne korzystanie z produktu, bez jakiejkolwiek ingerencji w niego Obecnie w wersji 1.35 Aplikacja standalone lub zintegrowana ze środowiskiem Visual Studio Team System FxCop - Użycie FxCopCmd Narzędzie konsolowe Generuje plik XML z wynikami badania Aby wyniki badnia były czytelne, najlepiej zastosować jedną z dostępnych transformacji XML Brak możliwości definicji projektu przy użyciu FxCopCmd FxCop Narzędzie graficzne Aby stworzyć projekt, należy użyć FxCop Co pokażemy Badanie zgodności kodu z regułami przy użyciu FxCop’a Stworzenie własnej reguły Cecil - Funkcjonalność Umożliwia inspekcję programów i bibliotek skompilowanych do kodu ECMA CIL (Common Intermediate Language) Możliwa jest również modyfikacja kodu i zapisanie assembly z powrotem do pliku W odróżnieniu od Reflection i Reflection.Emit umożliwia bezpośredni dostęp do kodu CIL, nie wymaga ładowania assembly ani spełnienia zależności Cecil - Produkt Część projektu Mono w postaci niezależnego zestawu klas Rozwijany był m.in. w ramach Google SoC Licencja MIT/X11 Wykorzystywany przez wiele programów: Mono Migration Analyzer (MoMA), MonoDevelop, mdb, Gendarme, Reflexir (dodatek do Reflector), linker w Mono, ... Cecil - Użycie Brak stabilnego API, brak pełnej dokumentacji, brak łatwo dostępnych przykładów Use the Source, Luke! Pokażemy dwa przykłady: program wypisujący nazwy typów z assembly, program dodający wypisywanie komunikatu na początku każdej metody. Gendarme Odpowiednik FxCopa w projekcie Mono Na chwilę obecną, brak oficjalnych wydań Wersją z SVN wymaga Cecil z SVN, który wymaga najnowszego Mono... Gendarme - Reguły Dostarczone reguły (69) są częściowo wzorowane na tych z FxCopa Podobne grupy: BadPractice, Concurency, Correctnes, Design, Exceptions, Naming, Performance, Portability, Interoperability, Security, Smells, User Interface Przykładowe ciekawsze reguły: MethodCanBeMadeStatic, DontDestroyStackTrace, DoubleCheckLocking Gendarme - Użycie Obecnie istnieje jedynie konsolowy front-end, autor zachęca do napisania graficznego W pliku konfiguracyjnym określamy, które reguły i z którego pliku DLL mają być użyte Generuje raport w HTML, XML lub jako zwykły tekst Jako przykład użycia, pokażemy też, jak może wyglądać własna reguła - DontUseDupaRule