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