Statyczna analiza kodu
Analiza statyczna kodu - analiza struktury kodu źródłowego lub kodu skompilowanego bez jego uruchomienia.
Static Analysis Software Testing (SAST) - narzędzia do analizy statycznej
Analiza statyczna a inspekcja kodu („code review”)
Metody analizy
analiza leksykograficzna - wyszukiwanie niebezpiecznych konstrukcji w kodzie źródłowym, zazwyczaj na podstawie zestawu reguł, różnych heurystyk i dopasowania do wzorców błedów
metody formalne - oparte na matematycznej definicji zachowania programu
obliczanie metryk kodu źródłowego. Ocena jakości kodu źródłowego na podstawie danych statystycznych.
Cechy
Łatwość użycia, prostota wdrożenia w cykl wytwarzania oprogramowania
Automatyzacja, integracja z narzędziami continius integrations
Szybkie wykrywanie błędów, których naprawa jest prosta i mało kosztowna
Możliwości rozszerzania: własne reguły, wtyczki,
Integracja z innymi narzędziami: serwery automatyzacji, IDE, kontrola wersji
Dużo darmowych narzędzi
Cechy c.d.
Wymagany dostęp do źródeł
Reguły wykrywają zazwyczaj proste błędy (nie zastąpią ręcznego sprawdzenia)
Dużo szumu, zbyt czułe (duże prawdopodobieństwo false positive)
Każde narzędzie zazwyczaj pokrywa pewien zakres testów (do 14% błędów?!) dlatego warto korzystać z kilku.
Istnieją narzędzia integrujące wiele narzędzi SAST, np:
CodeEx, Yast (open source)
Nie zastąpi „ręcznego” sprawdzania (code review)
Czego dotyczy analiza statyczna
analiza poprawności składni
luki w bezpieczeństwie, także błędy które mogą pojawić się przy specyficznych danych wejściowych
detekcja backdoors, niebezpieczne i nieaktualne funkcje, wycieki pamięci, przepełnienie bufora, używanie niezainicjowanych zmiennych, SQL Injections,
jakość kodu, ocena stylu, powtórzenia kodu, nieużywane fragmenty kodu, …
wydajność, wykrywanie wąskich gardeł, niewydajne konstrukcje, sugestie dotyczące poprawienia wydajności
zgodność z dobrymi praktykami, zachowanie standardów, norm nazewniczych, problemy z przenośnością kodu
Dlaczego analizować kod?
Statyczna analiza programu pozwala na:
zwiększenie wydajności i stabilności poprzez zasady oparte na dobrych praktykach,
unikniecie typowych błędów podczas programowania,
dostarczenie struktury do zarządzania standardami kodu.
wymuszenie zasad i standardów pisania kodu
zwiększanie bezpieczeństwa poprzez kolejny etap testowania
Narzędzia
Lint - UNIX V7 1979, historyczny program od którego nazwy często określa się narzędzia do analizy i szukania błedów
Wielojęzykowe
rats (rough auditing tool for security) C, C++, Perl, PHP, Python
PMD Java, JavaScript, XML, XSL (zawiera CPD analiza powtórzeń: C, C++, C#, PHP, Ruby, Fortran)
Yasca Java, C/C++, HTML, JavaScript, ASP, ColdFusion, PHP, COBOL, .NET, and other languages + integracja z innymi SAT
-
Wiele innych:
Ograniczenia
Jest wiele typów błędów które ciężko jest wykryć
Trudno wykrywalne błędy związane są z konfiguracją lub logiką biznesową.
Dodatkowe moduły, biblioteki, konteksty dodawane przez frameworki
Skomplikowane algorytmy i architektury
// calculate the number of days
int days = hours / 23;