Abordările de revizuire a codului sursă includ: Analiza codului moștenit atunci când codul sursă este pierdut: a face sau a nu face? Metode de analiză statică


Analiza codului static este procesul de identificare a erorilor și a deficiențelor în codul sursă al programelor. Analiza statică poate fi considerată ca un proces automat de revizuire a codului. Să aruncăm o privire mai atentă la revizuirea codului.

Revizuirea codului este una dintre cele mai vechi și mai fiabile metode de identificare a defectelor. Constă în citirea în comun cu atenție a codului sursă și în formularea de recomandări pentru îmbunătățirea acestuia. Procesul de citire a codului dezvăluie erori sau secțiuni de cod care pot deveni eronate în viitor. De asemenea, se crede că autorul codului nu ar trebui să explice cum funcționează această sau acea parte a programului în timpul revizuirii. Algoritmul de operare ar trebui să fie clar direct din textul programului și din comentarii. Dacă această condiție nu este îndeplinită, atunci codul trebuie modificat.

De obicei, recenziile de cod funcționează bine, deoarece programatorii sunt mult mai probabil să detecteze erori în codul altor persoane. Puteți afla mai multe despre tehnicile de revizuire a codului în excelenta carte a lui Steve McConnell, Code Complete.

Singurul dezavantaj semnificativ al metodologiei de revizuire colaborativă a codului este costul extrem de ridicat. Mai mulți programatori ar trebui reuniți în mod regulat pentru a revizui codul nou sau a reexamina codul după ce au fost făcute recomandări. În același timp, programatorii trebuie să facă pauze regulate de odihnă. Dacă încercați să revizuiți bucăți mari de cod simultan, atenția dvs. va deveni rapid plictisitoare și beneficiile revizuirii codului vor dispărea rapid.

Se pare că, pe de o parte, doriți să revizuiți în mod regulat codul. Pe de altă parte, este prea scump. O soluție de compromis este instrumentele de analiză statică a codului. Ei procesează neobosit codul sursă al programelor și emit recomandări programatorului să acorde o atenție deosebită anumitor secțiuni ale codului. Desigur, programul nu va înlocui o revizuire completă a codului efectuată de o echipă de programatori. Totuși, raportul beneficiu/cost face ca utilizarea analizei statice să fie o practică foarte utilă folosită de multe companii.

Problemele rezolvate de programele de analiză statică a codului pot fi împărțite în 3 categorii:

  • Identificarea erorilor din programe. Acest lucru va fi discutat mai detaliat mai jos.
  • Recomandări pentru formatarea codului. Unele analizoare statice vă permit să verificați dacă codul sursă respectă standardul de formatare a codului companiei. Aceasta se referă la controlul cantității de indentare în diferite modele, utilizarea spațiilor/caractere de tab și așa mai departe.
  • Numărarea metrică. O metrică software este o măsură care oferă o valoare numerică pentru o anumită proprietate a software-ului sau specificațiile acestuia. Există o varietate de valori care pot fi calculate folosind diverse instrumente.

Alte beneficii ale analizei codului static:

  • Acoperire completă a codului. Analizoarele statice verifică chiar și acele fragmente de cod care primesc control extrem de rar. Astfel de secțiuni de cod, de regulă, nu pot fi testate prin alte metode. Acest lucru vă permite să găsiți defecte în gestionatorii de evenimente rare, manipulatorii de erori sau sistemul de înregistrare.
  • Analiza statică este independentă de compilatorul utilizat și de mediul în care va fi executat programul compilat. Acest lucru vă permite să găsiți erori ascunse care pot apărea abia după câțiva ani. De exemplu, acestea sunt erori. Astfel de erori pot apărea la schimbarea versiunii compilatorului sau la utilizarea altor comutatoare pentru a optimiza codul. Un alt exemplu interesant de erori ascunse este dat în articolul „”.
  • Puteți detecta ușor și rapid greșelile de scriere și . De regulă, găsirea acestor erori în alte moduri este o pierdere ineficientă de timp și efort. Este păcat după o oră de depanare să descoperi că eroarea este într-o expresie de genul „strcmp(A, A)”. Când discutăm despre erori tipice, astfel de gafe nu sunt de obicei menționate. Dar, în practică, se petrece timp semnificativ identificându-le.

Dezavantajele analizei codului static

  • Analiza statică este în general slabă în diagnosticarea scurgerilor de memorie și a erorilor de concurență. Pentru a detecta astfel de erori, trebuie să executați practic o parte a programului. Acest lucru este extrem de dificil de implementat. De asemenea, astfel de algoritmi necesită multă memorie și timp CPU. De regulă, analizoarele statice se limitează la diagnosticarea cazurilor simple. O modalitate mai eficientă de a identifica pierderile de memorie și erorile concurente este utilizarea instrumentelor de analiză dinamică.
  • Programul de analiză statică avertizează despre locurile suspecte. Aceasta înseamnă că, de fapt, codul poate fi complet corect. Acestea se numesc false pozitive. Doar un programator poate înțelege dacă analizorul indică o eroare sau a generat un fals pozitiv. Necesitatea de a căuta false pozitive ocupă timp de lucru și reduce atenția asupra acelor părți ale codului care conțin de fapt erori.

Erorile detectate de analizoarele statice sunt foarte diverse. Aici, de exemplu, sunt implementate în instrumentul PVS-Studio. Unii analizoare sunt specializate într-o anumită zonă sau tip de defect. Alții acceptă anumite standarde de codare, de exemplu MISRA-C:1998, MISRA-C:2004, Regulile Sutter-Alexandrescu, Regulile Meyers-Klaus și așa mai departe.

Adnotare

În prezent, un număr mare de instrumente au fost dezvoltate pentru a automatiza căutarea vulnerabilităților programelor. Acest articol va discuta unele dintre ele.

Introducere

Analiza codului static este o analiză software care se realizează pe codul sursă al programelor și este implementată fără a executa efectiv programul studiat.

Software-ul conține adesea diverse vulnerabilități din cauza erorilor din codul programului. Erorile făcute în timpul dezvoltării programului în unele situații duc la eșecul programului și, în consecință, funcționarea normală a programului este întreruptă: aceasta duce adesea la modificări și deteriorarea datelor, oprirea programului sau chiar a sistemului. Majoritatea vulnerabilităților sunt asociate cu prelucrarea incorectă a datelor primite din exterior sau cu verificarea insuficient de strictă a acestora.

Pentru a identifica vulnerabilitățile, sunt utilizate diverse instrumente, de exemplu, analizoare statice ale codului sursă al programului, a căror prezentare generală este dată în acest articol.

Clasificarea vulnerabilităților de securitate

Când este încălcată cerința ca un program să funcționeze corect pe toate datele de intrare posibile, devine posibilă apariția așa-numitelor vulnerabilități de securitate. Vulnerabilitățile de securitate pot însemna că un program poate fi utilizat pentru a depăși limitările de securitate ale unui întreg sistem.

Clasificarea vulnerabilităților de securitate în funcție de erorile software:

  1. Buffer overflow. Această vulnerabilitate apare din cauza lipsei de control asupra matricei în afara limitelor din memorie în timpul execuției programului. Când un pachet de date prea mare depășește tamponul de dimensiune limitată, conținutul locațiilor de memorie străine este suprascris, provocând blocarea și ieșirea programului. Pe baza locației buffer-ului în memoria de proces, depășirile de buffer se disting pe stivă (depășire buffer stivă), heap (depășire buffer heap) și zona de date statice (debordare buffer bss).
  2. Vulnerabilități (vulnerabilitate de intrare contaminată). Vulnerabilitățile pot apărea atunci când intrarea utilizatorului este transmisă fără un control suficient interpretului unui limbaj extern (de obicei, un limbaj shell Unix sau SQL). În acest caz, utilizatorul poate specifica datele de intrare în așa fel încât interpretul lansat va executa o comandă complet diferită de cea intenționată de autorii programului vulnerabil.
  3. Vulnerabilitatea șirurilor de format. Acest tip de vulnerabilitate de securitate este o subclasă de vulnerabilitate. Apare din cauza controlului insuficient al parametrilor atunci când se utilizează funcțiile de format I/O printf, fprintf, scanf etc. ale bibliotecii standard C. Aceste funcții iau ca unul dintre parametrii lor un șir de caractere care specifică formatul de intrare sau de ieșire al argumentelor funcției ulterioare. Dacă utilizatorul poate specifica tipul de formatare, această vulnerabilitate ar putea rezulta din utilizarea nereușită a funcțiilor de formatare a șirurilor.
  4. Vulnerabilități ca urmare a erorilor de sincronizare (condiții de cursă). Problemele asociate cu multitasking duc la situații numite: un program care nu este conceput pentru a rula într-un mediu multitasking poate crede că, de exemplu, fișierele pe care le folosește în activitatea sa nu pot fi modificate de un alt program. Drept urmare, un atacator care înlocuiește conținutul acestor fișiere de lucru la timp poate forța programul să efectueze anumite acțiuni.

Desigur, pe lângă cele enumerate, există și alte clase de vulnerabilități de securitate.

Revizuirea analizoarelor existente

Următoarele instrumente sunt utilizate pentru a detecta vulnerabilitățile de securitate din programe:

  • Depanare dinamice. Instrumente care vă permit să depanați un program în timpul execuției acestuia.
  • Analizoare statice (depanatoare statice). Instrumente care utilizează informații acumulate în timpul analizei statice a unui program.

Analizoarele statice indică acele locuri din program în care poate fi localizată o eroare. Aceste bucăți de cod suspecte pot fie să conțină o eroare, fie să fie complet inofensive.

Acest articol oferă o prezentare generală a mai multor analizoare statice existente. Să aruncăm o privire mai atentă la fiecare dintre ele.

1.BOON

Un instrument care, bazat pe o analiză semantică profundă, automatizează procesul de scanare a textelor sursă C în căutarea unor vulnerabilități care pot duce la depășiri de buffer. Identifică posibilele defecte presupunând că unele valori fac parte dintr-un tip implicit cu o anumită dimensiune a tamponului.

2.Cal

Un instrument de analiză pentru detectarea erorilor în programele C. Programul extinde limbajul C cu specificatori suplimentari de tip definiți de utilizator. Programatorul își comentează programul cu specificatorii corespunzători și cqual verifică erorile. Adnotările incorecte indică erori potențiale. Cqual poate fi folosit pentru a detecta potențiale vulnerabilități ale șirurilor de format.

3. MOPS

(Model checking Programs for Security) - un instrument pentru căutarea vulnerabilităților de securitate în programele C. Scopul său: ajustarea dinamică, asigurarea conformității programului C cu modelul static. MOPS utilizează un model de auditare a software-ului care este conceput pentru a ajuta la determinarea dacă un program se conformează unui set de reguli definite pentru crearea de programe securizate.

4. ITS4, RATS, PScan, Flawfinder

Următoarele analizoare statice sunt utilizate pentru a căuta erori de depășire a memoriei tampon și erori de formatare a șirurilor:

  1. . Un instrument simplu care scanează static codul sursă C/C++ pentru a detecta potențialele vulnerabilități de securitate. Semnalizează apelurile către funcții potențial periculoase, cum ar fi strcpy/memcpy, și efectuează o analiză semantică superficială, încercând să evalueze cât de periculos este un astfel de cod și oferă, de asemenea, sfaturi despre cum să-l îmbunătățească.
  2. . Utilitarul RATS (Rough Auditing Tool for Security) procesează codul scris în C/C++ și poate procesa scripturi în Perl, PHP și Python. RATS scanează codul sursă pentru a găsi apeluri de funcție potențial periculoase. Scopul acestui instrument nu este de a găsi definitiv erori, ci de a oferi concluzii rezonabile, pe baza cărora un specialist poate revizui manual codul. RATS folosește o combinație de verificări de securitate, de la verificări semantice în ITS4 până la analize semantice profunde pentru a căuta defecte de depășire a tamponului obținute de la MOPS.
  3. . Scanează codul sursă C pentru utilizarea potențial incorectă a funcțiilor de tip printf și identifică vulnerabilități în șirurile de format.
  4. . La fel ca RATS, este un scaner static de cod sursă pentru programe scrise în C/C++. Caută funcțiile cele mai frecvent utilizate greșit, le atribuie scoruri de risc (pe baza informațiilor precum parametrii trecuți) și alcătuiește o listă de vulnerabilități potențiale, clasificându-le în funcție de risc.

Toate aceste instrumente sunt similare și folosesc doar analiza lexicală și de bază. Prin urmare, rezultatele produse de aceste programe pot conține până la 100% mesaje false.

5. Ciorchine

Un instrument pentru analiza și vizualizarea programelor C, care construiește un grafic de dependență care ajută auditorul să înțeleagă structura modulară a programului.

6. ONU

Un simplu analizor de cod sursă. A fost conceput pentru a găsi erori, cum ar fi variabile neinițializate, pointeri nuli și matrice în afara limitelor. UNO vă permite să efectuați o analiză simplă a fluxului de control și a fluxurilor de date, să efectuați atât analize intra- și interprocedurale și să specificați proprietățile utilizatorului. Dar acest instrument nu a fost dezvoltat pentru analiza aplicațiilor reale, nu acceptă multe biblioteci standard și, în această etapă de dezvoltare, nu permite analizarea unor programe serioase.

7. FlexeLint (PC-Lint)

Acest analizor este conceput pentru a analiza codul sursă pentru a identifica erori de diferite tipuri. Programul efectuează o analiză semantică a codului sursă, fluxul de date și analiza controlului.

La sfârșitul lucrării, sunt emise mesaje de mai multe tipuri principale:

  • Este posibil un pointer nul;
  • Probleme cu alocarea memoriei (de exemplu, nu există free() după malloc());
  • Flux de control problematic (de exemplu, cod inaccesibil);
  • Posibil depășire a tamponului, depășire aritmetică;
  • Avertismente despre stilul de cod rău și potențial periculos.

8. Viva64

Un instrument care ajută specialiștii să urmărească fragmentele potențial periculoase din codul sursă al programelor C/C++ asociate cu trecerea de la sistemele pe 32 de biți la cele pe 64 de biți. Viva64 este integrat în mediul Microsoft Visual Studio 2005/2008, ceea ce facilitează lucrul convenabil cu acest instrument. Analizorul vă ajută să scrieți cod corect și optimizat pentru sistemele pe 64 de biți.

9. Testul Parasoft C++

Un instrument specializat pentru Windows care vă permite să automatizați analiza calității codului C++. Pachetul C++Test analizează proiectul și generează cod pentru a testa componentele conținute în proiect. Pachetul C++ Test face treaba foarte importantă de a analiza clasele C++. După ce proiectul este încărcat, trebuie să configurați metodele de testare. Software-ul examinează fiecare argument al metodei și returnează tipurile valorilor corespunzătoare. Pentru aceste tipuri simple, valorile implicite ale argumentului sunt înlocuite; Puteți defini date de testare pentru tipuri și clase definite de utilizator. Puteți suprascrie argumentele implicite C++ Test și puteți returna valorile obținute din testare. De remarcat este capacitatea C++Test de a testa codul neterminat. Software-ul generează cod stub pentru orice metodă și funcție care nu există deja. Este acceptată simularea dispozitivelor externe și a datelor de intrare specificate de utilizator. Ambele funcții permit testarea repetată. După definirea parametrilor de testare pentru toate metodele, pachetul C++Test este gata să ruleze cod executabil. Pachetul generează cod de testare apelând compilatorul Visual C++ pentru al pregăti. Este posibil să se genereze teste la nivel de metodă, clasă, fișier și proiect.

10.Acoperire

Instrumentele sunt folosite pentru a identifica și corecta defectele de siguranță și calitate în aplicațiile critice. Tehnologia Coverity înlătură barierele în calea scrierii și implementării software-ului complex prin automatizarea detectării și rezolvării erorilor critice ale software-ului și a defectelor de securitate în timpul procesului de dezvoltare. Instrumentul Coverity este capabil să proceseze zeci de milioane de linii de cod cu o eroare pozitivă minimă, oferind o acoperire de urmărire de 100%.

11. KlocWork K7

Produsele companiei sunt concepute pentru analiza automată a codului static, identificarea și prevenirea defectelor software și a problemelor de securitate. Instrumentele companiei ajută la identificarea cauzelor fundamentale ale defectelor de calitate și securitate a software-ului și să urmărească și să prevină aceste defecte pe parcursul procesului de dezvoltare.

12. Frama-C

Un set deschis, integrat de instrumente pentru analiza codului sursă în limbajul C. Setul include ACSL (ANSI/ISO C Specification Language) - un limbaj special care vă permite să descrieți în detaliu specificațiile funcțiilor C, de exemplu, specificând intervalul de valori de intrare valide ale unei funcții și domeniul de ieșire normală. valorile.

Acest set de instrumente vă ajută să faceți următoarele:

  • Efectuează revizuirea formală a codului;
  • Căutați potențiale erori de execuție;
  • Efectuați un audit sau o revizuire a codului;
  • Efectuați inginerie inversă a codului pentru a îmbunătăți înțelegerea structurii;
  • Generați documentație formală.

13. CodeSurfer

Un instrument de analiză a programelor care nu este conceput special pentru a găsi vulnerabilități de securitate. Principalele sale avantaje sunt:

  • Analiza pointerului;
  • Diverse analize ale fluxului de date (utilizarea și definirea variabilelor, dependența de date, construcția graficului de apel);
  • Limbajul scriptului.

CodeSurfer poate fi folosit pentru a găsi erori în codul sursă, pentru a îmbunătăți înțelegerea codului sursă și pentru programele de inginerie inversă. Un instrument prototip pentru detectarea vulnerabilităților de securitate a fost dezvoltat în mediul CodeSurfer, dar instrumentul dezvoltat este utilizat numai în cadrul organizației de dezvoltare.

14. FxCop

Oferă un mijloc de a verifica automat ansamblurile .NET pentru conformitatea cu Ghidurile de proiectare Microsoft .NET Framework. Codul compilat este verificat folosind mecanisme de reflectare, analiza MSIL și analiza graficului de apel. Ca rezultat, FxCop este capabil să detecteze mai mult de 200 de defecte (sau erori) în următoarele domenii:

  • Arhitectura bibliotecii;
  • Localizare;
  • Reguli de denumire;
  • Performanţă;
  • Siguranţă.

FxCop oferă posibilitatea de a crea propriile reguli folosind un SDK special. FxCop poate rula fie într-o GUI, fie pe linia de comandă.

15. JavaChecker

Acesta este un analizor static de programe Java bazat pe tehnologia TermWare.

Acest instrument vă permite să identificați defectele codului, cum ar fi:

  • gestionarea neglijentă a excepțiilor (blocuri de captură goale, aruncarea de excepții generice etc.);
  • ascunderea numelor (de exemplu, când numele unui membru al clasei este același cu numele unui parametru formal al unei metode);
  • încălcări ale stilului (puteți seta stilul de programare folosind un set de expresii regulate);
  • încălcări ale contractelor standard de utilizare (de exemplu, când metoda equals este suprascrisă, dar nu hashCode);
  • încălcări de sincronizare (de exemplu, când accesul la o variabilă sincronizată este în afara unui bloc sincronizat).

Setul de verificări poate fi controlat folosind comentarii de control.

JavaChecker poate fi apelat dintr-un script ANT.

16. Simian

Un analizor de similaritate care caută sintaxa repetată în mai multe fișiere simultan. Programul înțelege sintaxa diferitelor limbaje de programare, inclusiv C#, T-SQL, JavaScript și Visual BasicR și poate căuta, de asemenea, fragmente repetate în fișiere text. Opțiunile multiple de personalizare vă permit să ajustați regulile de căutare a codului duplicat. De exemplu, parametrul prag determină câte linii repetate de cod sunt considerate duplicate.

Simian este un instrument mic conceput pentru a găsi eficient codul duplicat. Nu are interfață grafică, dar poate fi lansat din linia de comandă sau accesat programatic. Rezultatele sunt transmise sub formă de text și pot fi prezentate într-unul dintre formatele încorporate (de exemplu, XML). În timp ce interfața rară a lui Simian și capabilitățile limitate de ieșire necesită un pic de curbă de învățare, ajută la menținerea integrității și eficacității produsului. Simian este potrivit pentru găsirea codului duplicat atât în ​​proiecte mari, cât și în proiecte mici.

Codul duplicat reduce mentenabilitatea și actualizarea proiectului. Puteți folosi Simian pentru a găsi rapid fragmente de cod duplicate în mai multe fișiere simultan. Deoarece Simian poate fi rulat din linia de comandă, acesta poate fi inclus în procesul de construire pentru a primi avertismente sau pentru a opri procesul în cazul repetării codului.

Concluzie

Deci, acest articol a examinat analizatorii statici de cod sursă, care sunt instrumente auxiliare pentru programator. Fiecare instrument este diferit și ajută la monitorizarea unei game largi de clase de vulnerabilități de securitate din programe. Putem concluziona că analizoarele statice trebuie să fie precise și sensibile. Dar, din păcate, instrumentele de depanare statică nu pot oferi rezultate absolut fiabile.

Termenul este de obicei aplicat analizelor efectuate prin software special, în timp ce analiza manuală este numită înţelegere sau înţelegere programe.

În funcție de instrumentul utilizat, profunzimea analizei poate varia de la identificarea comportamentului declarațiilor individuale până la o analiză care include tot codul sursă disponibil. Modalitățile de utilizare a informațiilor obținute în timpul analizei sunt, de asemenea, diferite - de la identificarea locurilor care pot conține erori, până la metode formale care fac posibilă demonstrarea matematică a oricăror proprietăți ale programului (de exemplu, conformitatea comportamentului cu specificația).

Unii oameni consideră că metricile software și ingineria inversă sunt forme de analiză statică.

Recent, analiza statică a fost folosită din ce în ce mai mult în verificarea proprietăților software-ului utilizat în sistemele informatice de înaltă fiabilitate.

Majoritatea compilatoarelor (de exemplu, GNU C Compiler) afișează „avertismente” pe ecran. avertismente) - mesaje că codul, deși corect din punct de vedere sintactic, conține cel mai probabil o eroare. De exemplu:

Int x; int y = x+ 2 ;

// Variabila x nu este inițializată!

Aceasta este cea mai simplă analiză statică. Compilatorul are multe alte caracteristici importante - în primul rând, viteza și calitatea codului mașină, astfel încât compilatorii verifică codul numai pentru erori evidente. Analizoarele statice sunt proiectate pentru o analiză mai detaliată a codului.

  • Tipuri de erori detectate de analizoarele statice
  • Comportament nedefinit - variabile neinițializate, acces la pointeri NULL. Compilatorii semnalează și cele mai simple cazuri.
  • Încălcarea diagramei de utilizare a bibliotecii. De exemplu, fiecare fopen are nevoie de un fclose . Și dacă variabila fișier este pierdută înainte ca fișierul să fie închis, analizorul poate raporta o eroare.
  • Scenarii comune care duc la un comportament nedocumentat. Biblioteca C Standard este cunoscută pentru numeroasele sale soluții tehnice slabe. Unele funcții, cum ar fi gets , sunt în mod inerent nesigure. sprintf și strcpy sunt sigure doar în anumite condiții.

Buffer overflow este atunci când un program de calculator scrie date dincolo de buffer-ul alocat în memorie. Void do Something(const char * x) ( char s[ 40 ] ; sprintf (s, "[%s]" , x) ; .... }

  • // sprintf către bufferul local, posibil depășire

Scenarii comune care împiedică funcționalitatea multiplatformă.< int >Obiect * p = getObject() ; int pNum = reinterpret_cast

  • Erori în cod dublu. Multe programe execută același lucru de mai multe ori cu argumente diferite. De obicei, fragmentele repetate nu sunt scrise de la zero, ci mai degrabă multiplicate și corectate.

Dest.x = src.x + dx;

dest.y = src.y + dx;

  • // Eroare, trebuie!

Std::wstring s; printf ("s este %s" , s); Un parametru neschimbat transmis unei funcții este un semn al cerințelor modificate pentru program. Pe vremuri parametrul era activat, dar acum nu mai este necesar. În acest caz, programatorul poate scăpa complet de acest parametru - și de logica asociată acestuia. Void do Something (int n, bool flag)// steag este întotdeauna adevărat (dacă (steagul) (// ceva logică

) altfel ( // codul este acolo, dar nu este folosit

) ) face Something(n, true ) ;

... face Something(10, true);

  • ... face Something(x.size(), true);
  • Std::string s;
  • ...s.gol();
  • // codul nu face nimic; probabil te-ai referit la clar()?

Metode formale

  • Instrumente de analiză statică
  • Acoperire
  • lint și lock_lint sunt incluse în Sun Studio
  • T-SQL Analyzer este un instrument care poate examina modulele software din bazele de date care rulează Microsoft SQL Server 2005 sau 2008 și poate detecta potențiale probleme din cauza calității slabe a codului.

AK-VS

Vezi de asemenea


Semantica formală a limbajului

Analiza software

    Degradarea treptată

    SPARK - japoneză

    Note

    Legături

    Depanarea este etapa de dezvoltare a programelor de calculator în care erorile sunt detectate, localizate și eliminate. Pentru a înțelege unde a apărut eroarea, trebuie să: aflați valorile curente ale variabilelor; afla ce cale a fost folosita... ... Wikipedia

    Tip Analizor de cod static Dezvoltator BiPro laborator Scris în C++ Sistem de operare Multiplatformă Limbi de interfață Engleză... Wikipedia

Analiza codului static Acesta este procesul de identificare a erorilor și a deficiențelor în codul sursă al programelor. Analiza statică poate fi considerată ca un proces automat de revizuire a codului. Să aruncăm o privire mai atentă la revizuirea codului.

Revizuirea codului este una dintre cele mai vechi și mai fiabile metode de identificare a defectelor. Constă în citirea în comun cu atenție a codului sursă și în formularea de recomandări pentru îmbunătățirea acestuia. Procesul de citire a codului dezvăluie erori sau părți ale codului care pot deveni eronate în viitor. De asemenea, se crede că autorul codului nu ar trebui să dea explicații în timpul revizuirii modului în care funcționează una sau acea parte a programului. Algoritmul de operare ar trebui să fie clar direct din textul programului și din comentarii. Dacă această condiție nu este îndeplinită, atunci codul trebuie modificat.

De obicei, recenziile de cod funcționează bine, deoarece programatorii sunt mult mai probabil să detecteze erori în codul altor persoane. Puteți afla mai multe despre tehnicile de revizuire a codului în excelenta carte a lui Steve McConnell, Code Complete.

Singurul dezavantaj semnificativ al metodologiei de revizuire colaborativă a codului este costul extrem de ridicat. Mai mulți programatori ar trebui reuniți în mod regulat pentru a revizui codul nou sau a reexamina codul după ce au fost făcute recomandări. În același timp, programatorii trebuie să facă pauze regulate de odihnă. Dacă încercați să revizuiți bucăți mari de cod simultan, atenția dvs. va deveni rapid plictisitoare și beneficiile revizuirii codului vor dispărea rapid.

Se pare că, pe de o parte, doriți să revizuiți în mod regulat codul. Pe de altă parte, este prea scump. O soluție de compromis este instrumentele de analiză statică a codului. Ei procesează neobosit codul sursă al programelor și emit recomandări programatorului să acorde o atenție deosebită anumitor secțiuni ale codului. Desigur, programul nu va înlocui o revizuire completă a codului efectuată de o echipă de programatori. Totuși, raportul beneficiu/cost face ca utilizarea analizei statice să fie o practică foarte utilă folosită de multe companii.

Problemele rezolvate de programele de analiză statică a codului pot fi împărțite în 3 categorii:

  1. Identificarea erorilor din programe. Acest lucru va fi discutat mai detaliat mai jos.
  2. Recomandări pentru formatarea codului. Unele analizoare statice vă permit să verificați dacă codul sursă respectă standardul de formatare a codului companiei. Aceasta se referă la controlul cantității de indentare în diferite modele, utilizarea spațiilor/caractere de tab și așa mai departe.
  3. Numărarea metrică. O metrică software este o măsură care oferă o valoare numerică pentru o anumită proprietate a software-ului sau specificațiile acestuia. Există un număr mare de valori diferite care pot fi calculate folosind diverse instrumente.

Alte beneficii ale analizei codului static:

  1. Acoperire completă a codului. Analizoarele statice verifică chiar și acele fragmente de cod care primesc control extrem de rar. Astfel de secțiuni de cod, de regulă, nu pot fi testate prin alte metode. Acest lucru vă permite să găsiți defecte în gestionatorii de evenimente rare, manipulatorii de erori sau sistemul de înregistrare.
  2. Analiza statică este independentă de compilatorul utilizat și de mediul în care va fi executat programul compilat. Acest lucru vă permite să găsiți erori ascunse care pot apărea abia după câțiva ani. De exemplu, acestea sunt erori de comportament nedefinit. Astfel de erori pot apărea la schimbarea versiunii compilatorului sau la utilizarea altor comutatoare pentru optimizarea codului. Un alt exemplu interesant de erori ascunse este dat în articolul „Suprascrieți memoria - de ce?”.
  3. Puteți identifica ușor și rapid greșelile de scriere și consecințele utilizării Copy-Paste. De regulă, găsirea acestor erori în alte moduri este o pierdere ineficientă de timp și efort. Este păcat după o oră de depanare să descoperi că eroarea este într-o expresie de genul „strcmp(A, A)”. Când discutăm despre greșelile tipice, astfel de gafe nu sunt de obicei menționate. Dar, în practică, se petrece timp semnificativ identificându-le.

Dezavantajele analizei codului static

  1. Analiza statică este în general slabă în diagnosticarea scurgerilor de memorie și a erorilor de concurență. Pentru a detecta astfel de erori, trebuie să executați practic o parte a programului. Acest lucru este extrem de dificil de implementat. De asemenea, astfel de algoritmi necesită multă memorie și timp CPU. De regulă, analizoarele statice se limitează la diagnosticarea cazurilor simple. O modalitate mai eficientă de a identifica pierderile de memorie și erorile concurente este utilizarea instrumentelor de analiză dinamică.
  2. Programul de analiză statică avertizează despre locurile suspecte. Aceasta înseamnă că, de fapt, codul poate fi complet corect. Acestea se numesc false pozitive. Doar un programator poate înțelege dacă analizorul indică o eroare sau a generat un fals pozitiv. Necesitatea de a căuta false pozitive ocupă timp de lucru și reduce atenția asupra acelor părți ale codului care conțin de fapt erori.

Erorile detectate de analizoarele statice sunt foarte diverse. Iată, de exemplu, o listă de diagnostice care sunt implementate în instrumentul PVS-Studio. Unii analizoare sunt specializate într-o anumită zonă sau tip de defect. Alții acceptă anumite standarde de codare, de exemplu MISRA-C:1998, MISRA-C:2004, Regulile Sutter-Alexandrescu, Regulile Meyers-Klaus și așa mai departe.

Domeniul analizei statice se dezvoltă activ, apar noi reguli și standarde de diagnosticare, iar unele reguli devin învechite. Prin urmare, nu are rost să încercăm să comparăm analizoarele pe baza listelor de defecte detectate. Singura modalitate de a compara instrumentele este să le rulați printr-un set de proiecte și să numărați numărul de erori reale pe care le găsesc. Acest subiect este tratat mai detaliat în articolul „

  • Serghei Savenkov

    un fel de recenzie „scurtă”... de parcă s-ar grăbi undeva