Ce nu vor putea niciodată static analysis
Ce este practic, source code static analysis? Trimitem câteva surse code la intrare, iar la ieșire într-un timp scurt (mult mai scurt decât testul) obținem câteva informații despre codul nostru. Limitarea fundamentală și insurmontabilă din punct de vedere matematic este că nu putem obține în acest fel o clasă destul de restrânsă de informații.
Cel mai cunoscut exemplu de problemă care nu poate fi rezolvat cu ajutorul static analysis este problema de oprire: aceasta este o teoremă care dovedește că este imposibil să dezvolte un algoritm general care să determine prin codul sursă al unui program dacă se va bucla sau se va termina într-un timp finit. O extensie a acestei teoreme este teorema lui Rice, care afirmă că, pentru orice proprietate non-privată a funcțiilor computabile, a determina dacă un program arbitrar calculează o funcție cu această proprietate este o problemă algoritmic nesolvabilă. De exemplu, este imposibil să scrii un analizator care stabilește, folosind orice cod sursă, dacă programul analizat este o implementare a unui algoritm care calculează, să zicem, pătratul unui număr întreg.
Astfel, funcționalitatea analizatorilor statici are limită insurmontabile. În toate cazurile, analizatorul static nu va putea niciodată să detecteze astfel de lucruri, cum ar fi, de exemplu, apariția unei „excepții de indicator nul” în limbile nuloase sau în toate cazurile va determina apariția unui „atribut care nu se găsește” în limbile tipizate dinamic. Tot ceea ce poate face cel mai avansat analizor static este să izoleze cazuri particulare, dintre care numărul dintre toate problemele posibile cu codul sursă este, fără exagerare, o scădere a găleții.
Static analysis nu este o căutare a erorilor
Concluzia rezultă din cele de mai sus: static analysis nu este un mijloc de reducere a numărului de defecte dintr-un program. Mă aventurez să spun: atunci când este aplicat pentru prima oară proiectului dvs., va găsi locuri „ocupate” în cod, dar cel mai probabil nu va găsi defecte care să afecteze calitatea programului.
Exemplele de defecte găsite automat de analizatori sunt impresionante, dar nu trebuie să uităm că aceste exemple au fost găsite prin scanarea unui set mare de baze de coduri mari. După același principiu, crackerele care au capacitatea de a încerca câteva parole simple pe un număr mare de conturi găsesc în cele din urmă acele conturi care au o parolă simplă.
Asta înseamnă că nu trebuie aplicată static analysis? Sigur că nu! Și, exact pentru același motiv, de ce merită să verificați fiecare nouă parolă pentru prezența acesteia în stop-list a parolelor „simple”.