Analisi statica - da l'introduzione à l'integrazione

Stancu di rivisione di codice senza fine o di debugging, qualchì volta pensate cumu simplificà a vostra vita. E dopu avè cercatu un pocu, o da accidintali stumbling nantu à questu, pudete vede a frasa magica: "Analisi statica". Videmu ciò chì hè è cumu si pò interagisce cù u vostru prughjettu.

Analisi statica - da l'introduzione à l'integrazione
In fatti, s'è vo scrivite in ogni lingua muderna, tandu, senza mancu capitu, l'avete passate à traversu un analizatore staticu. U fattu hè chì ogni compilatore mudernu furnisce, ancu s'ellu hè un picculu, inseme di avvirtimenti nantu à i prublemi potenziali in u codice. Per esempiu, quandu compilate u codice C++ in Visual Studio pudete vede u seguente:

Analisi statica - da l'introduzione à l'integrazione
In questu output vedemu chì a variabile Var ùn hè mai statu usatu in ogni locu in a funzione. Allora in realtà, avete quasi sempre utilizatu un analizatore di codice staticu simplice. Tuttavia, à u cuntrariu di l'analizzatori prufessiunali cum'è Coverity, Klocwork o PVS-Studio, l'avvirtimenti furniti da u compilatore ponu indicà solu una piccula gamma di prublemi.

Se ùn sapete micca di sicuru ciò chì hè l'analisi statica è cumu implementà, leghje stu articuluper sapè più nantu à sta metodulugia.

Perchè avete bisognu di l'analisi statica?

In poche parole: accelerazione è simplificazione.

L'analisi statica permette di truvà parechji prublemi diffirenti in u codice: da l'usu incorrectu di e custruzzioni di lingua à i typos. Per esempiu, invece di

auto x = obj.x;
auto y = obj.y;
auto z = obj.z;

Avete scrittu u codice seguente:

auto x = obj.x;
auto y = obj.y;
auto z = obj.x;

Comu pudete vede, ci hè un typo in l'ultima linea. Per esempiu, PVS-Studio emette l'avvertimentu seguente:

V537 Cunsiderate a verificazione di a correttezza di l'usu di l'elementu "y".

Se vulete mette e vostre mani in questu errore, pruvate un esempiu prontu in Compiler Explorer: *pienghje*.

E cum'è avete capitu, ùn hè micca sempre pussibule di attentu à tali rùbbriche di codice subitu, è per quessa, pudete pusà à debugging per una bona ora, dumandendu perchè tuttu funziona cusì stranamente.

Tuttavia, questu hè chjaramente un sbagliu. E se u sviluppatore hà scrittu codice suboptimal perchè s'hè scurdatu di qualchì sutilezza di a lingua? O ancu permessu in u codice cumpurtamentu indefinitu? Sfurtunatamente, tali casi sò cumplettamente cumune è a parte di u leone di u tempu hè spesu per debugging specificamente codice di travagliu chì cuntene errori di battitura, errori tipici o cumpurtamentu indefinitu.

Hè per queste situazioni chì l'analisi statica apparsu. Questu hè un assistente per u sviluppatore chì indicà diversi prublemi in u codice è spiegà in a ducumentazione perchè ùn hè micca necessariu di scrive in questu modu, ciò chì pò guidà è cumu per riparà. Eccu un esempiu di ciò chì puderia esse cum'è: *pienghje*.

Pudete truvà errori più interessanti chì l'analizzatore pò detect in l'articuli:

Avà chì avete lettu stu materiale è sò cunvinti di i benefici di l'analisi statica, pudete vulete pruvà. Ma da induve principià? Cumu integrà un novu strumentu in u vostru prughjettu attuale? E cumu per presentà a squadra à ellu? Truverete risposte à queste dumande quì sottu.

Nota: L'analisi statica ùn rimpiazza o annullà una cosa cusì utile cum'è recensioni di codice. Cumplementa stu prucessu, aiutendu à avvistà è corregge i typos, imprecisioni è disinni periculosi in anticipu. Hè assai più pruduttivu di fucalizza nantu à e recensioni di codice nantu à l'algoritmi è a chiarezza di u codice, invece di circà una parentesi sbagliata o leghje funzioni di paragone noioso.

0. Cunniscite u strumentu

Tuttu principia cù una versione di prova. Infatti, hè difficiule di decide di implementà qualcosa in u prucessu di sviluppu se ùn avete mai vistu l'uttellu in diretta prima. Dunque, a prima cosa chì duvete fà hè di scaricà versione di prova.

Ciò chì amparate in questa tappa:

  • Chì sò i modi per interagisce cù l'analizzatore;
  • L'analizzatore hè cumpatibile cù u vostru ambiente di sviluppu?
  • Chì prublemi sò attualmente in i vostri prughjetti ?

Dopu avè installatu tuttu ciò chì avete bisognu, a prima cosa chì duvete fà hè di fà una analisi di tuttu u prughjettu (Windows, Linux, macOS). In u casu di PVS-Studio in Visual Studio, vi vede una stampa simile (cliccabile):

Analisi statica - da l'introduzione à l'integrazione
U fattu hè chì l'analizzatori statici di solitu emettenu un gran numaru d'avvertimenti per i prughjetti cù una grande basa di codice. Ùn ci hè bisognu di riparà tutti, postu chì u vostru prughjettu hè digià travagliatu, chì significa chì questi prublemi ùn sò micca critichi. Tuttavia, voi pudete vede l'avvirtimenti più interessanti è correggili se ne necessariu. Per fà questu, avete bisognu di filtrà a pruduzzioni è lasciate solu i missaghji più affidabili. In u plugin PVS-Studio per Visual Studio, questu hè fattu per filtrazione per livelli d'errore è categurie. Per a pruduzzioni più precisa, lasciate solu High и General (cliccabile ancu):

Analisi statica - da l'introduzione à l'integrazione
Infatti, 178 avvisi sò assai più faciuli di vede cà parechji millai...

In tabulazioni Medio и Low Spessu ci sò boni avvisi, ma queste categurie includenu quelli diagnostichi chì anu menu precisione (affidabilità). Più infurmazione nantu à i livelli di avvisu è l'opzioni per travaglià sottu Windows ponu esse truvati quì: *pienghje*.

Dopu avè rivisatu cù successu l'errori più interessanti (è corrette cù successu) vale a pena supprime l'avvirtimenti rimanenti. Questu hè necessariu per chì i novi avvirtimenti ùn si perde micca trà i vechji. Inoltre, un analizatore staticu hè un assistente per u programatore, è micca una lista di bugs. 🙂

1. Automatizazione

Dopu avè cunnisciutu, hè ora di cunfigurà plugins è integra in CI. Questu deve esse fattu prima chì i programatori cumincianu à aduprà l'analizzatore staticu. U fattu hè chì u programatore pò scurdà di attivà l'analisi o ùn vulete micca fà. Per fà questu, avete bisognu di fà qualchì verificazione finale di tuttu per chì u codice micca pruvatu ùn pò micca entra in u ramu generale di sviluppu.

Ciò chì amparate in questa tappa:

  • Chì opzioni d'automatizazione furnisce l'uttellu;
  • L'analizzatore hè cumpatibile cù u vostru sistema di assemblea?

Siccomu a documentazione perfetta ùn esiste micca, qualchì volta avete da scrive sustegnu. Questu hè normale è simu felici di aiutà. 🙂

Avà andemu à i servizii di integrazione cuntinua (CI). Ogni analizzatore pò esse implementatu in elli senza prublemi serii. Per fà questu, avete bisognu di creà una tappa separata in u pipeline, chì hè di solitu situatu dopu à e teste di custruzzione è unità. Questu hè fattu cù diverse utilità di cunsola. Per esempiu, PVS-Studio furnisce e seguenti utilità:

Per integrà l'analisi in CI, avete bisognu di fà trè cose:

  • Installa l'analizzatore;
  • Eseguite analisi;
  • Fate risultati.

Per esempiu, per installà PVS-Studio in Linux (Debian-base), avete bisognu di eseguisce i seguenti cumandamenti:

wget -q -O - https://files.viva64.com/etc/pubkey.txt 
    | sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list 
  https://files.viva64.com/etc/viva64.list
  
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio

In i sistemi chì funzionanu Windows, ùn ci hè micca manera di installà l'analizzatore da u gestore di pacchetti, ma hè pussibule implementà l'analizzatore da a linea di cummanda:

PVS-Studio_setup.exe /verysilent /suppressmsgboxes 
/norestart /nocloseapplications

Pudete leghje più nantu à l'implementazione di PVS-Studio nantu à i sistemi chì funzionanu Windows *ccà*.

Dopu à a stallazione, avete bisognu di eseguisce l'analisi direttamente. Tuttavia, hè cunsigliatu di fà questu solu dopu a compilazione è e teste sò passati. Questu hè chì l'analisi statica generalmente dura duie volte più di a compilazione.

Siccomu u metudu di lanciamentu dipende da a piattaforma è e funziunalità di u prughjettu, vi mustraraghju l'opzione per C++ (Linux) per esempiu:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w

U primu cumanda farà l'analisi, è u sicondu busteconverte u rapportu in u furmatu di testu, u mostra nantu à u screnu è torna un codice di ritornu altru chè 0 s'ellu ci sò avvirtimenti. Un mecanismu cum'è questu pò esse usatu convenientemente per bluccà una custruzzione quandu ci sò missaghji d'errore. Tuttavia, pudete sempre sguassà a bandiera -w è ùn bluccà una assemblea chì cuntene avvirtimenti.

Nota: U furmatu di testu hè inconveniente. Hè furnitu solu cum'è un esempiu. Prestate attenzione à un formatu di rapportu più interessante - FullHtml. Permette di navigà à traversu u codice.

Pudete leghje più nantu à a creazione di l'analisi nantu à CI in l'articulu "PVS-Studio è Integrazione Continua" (Windows) o "Cumu cunfigurà PVS-Studio in Travis CI" (Linux).

Va bè, avete cunfiguratu l'analizzatore nantu à u servitore di creazione. Avà, s'è qualcunu hà caricatu codice untested, a tappa di verificazione falla, è puderà detectà u prublema, però, questu ùn hè micca cumplettamente cunvene, postu chì hè più efficaci per verificà u prugettu micca dopu chì i rami sò stati fusionati, ma prima di questu, in a fase di pull request. A.

In generale, a creazione di un analisi di dumanda di pull ùn hè micca assai sfarente da u solitu lanciamentu di una analisi nantu à CI. Fora di a necessità di ottene una lista di i schedarii cambiati. Quessi pò esse generalmente ottenuti interrugandu e differenze trà e branche cù git:

git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

Avà avete bisognu di passà sta lista di schedari à l'analizzatore cum'è input. Per esempiu, in PVS-Studio questu hè implementatu cù a bandiera -S:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log 
                            -S .pvs-pr.list

Pudete sapè più nantu à l'analisi di e richieste di pull *ccà*. Ancu s'è u vostru CI ùn hè micca nantu à a lista di servizii citati in l'articulu, truverete a sezione generale dedicata à a teoria di stu tipu d'analisi utile.

Facendu l'analisi di e richieste di pull, pudete bluccà i cummissioni chì cuntenenu avvisi, creendu cusì un cunfini chì u codice micca pruvatu ùn pò micca attraversà.

Questu hè certamente bonu, ma mi piacerebbe esse capace di vede tutti l'avvirtimenti in un locu. Micca solu da l'analizzatore staticu, ma ancu da e teste di unità o da l'analizzatore dinamicu. Ci sò diversi servizii è plugins per questu. PVS-Studio, per esempiu, hà plugin per l'integrazione in SonarQube.

2. Integrazione nantu à i machini di sviluppatore

Avà hè u tempu di stallà è cunfigurà l'analizzatore per u sviluppu di ogni ghjornu. À questu puntu, avete digià familiarizatu cù a maiò parte di i modi di travaglià, cusì pò esse chjamatu a parte più faciule.

Cum'è l'opzione più simplice, i sviluppatori ponu installà l'analizzatore necessariu. In ogni casu, questu hà da piglià assai tempu è distractà da u sviluppu, cusì pudete automatizà stu prucessu cù un installatore è i bandieri necessarii. Per PVS-Studio ci sò parechji bandiere per l'installazione automatizata. Tuttavia, ci sò sempre gestori di pacchetti, per esempiu, Chocolatey (Windows), Homebrew (macOS) o decine d'opzioni per Linux.

Allora vi tuccherà à stallà i plugins nicissariu, per esempiu Tempi Studio, IDEA, Rider etc.

3. Usu ogni ghjornu

À questu stadiu, hè ora di dì uni pochi di parolle nantu à modi per accelerà l'analizzatore durante l'usu di ogni ghjornu. Un analisi cumpletu di u prughjettu sanu pigghia assai tempu, ma quantu spessu cambiemu u codice in tuttu u prugettu in una volta? Ci hè improbabile di esse un refactoring cusì grande chì affetterà immediatamente tutta a basa di codice. U numaru di schedarii chì sò cambiati in un tempu raramente supera una decina, cusì hè sensu per analizà. Per una tale situazione ci hè modu di analisi incrementali. Solu ùn vi allarmate, questu ùn hè micca un altru strumentu. Questu hè un modu speciale chì vi permette di analizà solu i schedarii cambiati è e so dependenzii, è questu succede automaticamente dopu à custruisce s'è vo avete travagliatu in un IDE cù u plugin installatu.

Se l'analizzatore detecta prublemi in u codice cambiatu di pocu tempu, hà da rapportà questu indipindente. Per esempiu, PVS-Studio vi dicerà di questu utilizendu una alerta:

Analisi statica - da l'introduzione à l'integrazione
Di sicuru, dicendu à i sviluppatori di utilizà l'uttellu ùn hè micca abbastanza. Avemu bisognu di dì à elli ciò chì hè è cumu hè. Eccu, per esempiu, sò articuli nantu à un iniziu rapidu per PVS-Studio, ma pudete truvà tutoriali simili per qualsiasi strumentu chì preferite:

Tali articuli furnisce tutte l'infurmazioni necessarii per l'usu di ogni ghjornu è ùn piglianu micca assai tempu. 🙂

Ancu in u stadiu di cunnosce l'uttellu, avemu suprimi assai avvirtimenti durante unu di i primi lanciamenti. Sfurtunatamente, l'analizzatori statichi ùn sò micca perfetti, cusì da u tempu à u tempu dà falsi pusitivi. Di solitu hè faciule di suppressione; per esempiu, in u plugin PVS-Studio per Visual Studio, basta à cliccà un buttone:

Analisi statica - da l'introduzione à l'integrazione
Tuttavia, pudete fà più cà solu suppressione. Per esempiu, pudete signalà un prublema per sustene. Se u falsu pusitivu pò esse currettu, allora in l'aghjurnamenti futuri pudete nutà chì ogni volta ci sò menu è menu falsi pusitivi specifichi à a vostra basa di codice.

Dopu l'integrazione

Allora avemu passatu tutte e tappe di integrazione di l'analisi statica in u prucessu di sviluppu. Malgradu l'impurtanza di stallà tali strumenti nantu à CI, u locu più impurtante per eseguisce hè l'urdinatore di u sviluppatore. Dopu tuttu, un analizatore staticu ùn hè micca un ghjudice chì dice in un locu luntanu da voi chì u codice ùn hè micca bonu. À u cuntrariu, hè un assistente chì vi dice s'è vo site stancu è vi ricurdeghja s'è vo avete scurdatu qualcosa.

True, senza usu regulare, l'analisi statica hè improbabile di simplificà significativamente u sviluppu. Dopu tuttu, u so benefiziu principale per un sviluppatore ùn hè micca tantu in a ricerca di sezzioni cumplessi è cuntruversu di codice, ma in a so deteczione precoce. Accettate chì scopre un prublema dopu chì l'edizioni sò stati mandati per a prova ùn hè micca solu dispiacevule, ma ancu assai tempu. L'analisi statica, quandu s'utilice regularmente, guarda ogni cambiamentu direttamente nantu à u vostru urdinatore è informa i posti sospetti mentre travaglia nantu à u codice.

È se voi o i vostri culleghi ùn sò micca sicuru s'ellu vale a pena implementà l'analizzatore, allora vi suggerisce chì avà principià à leghje l'articulu "Motivi per intruduce l'analizzatore di codice staticu PVS-Studio in u prucessu di sviluppu". Affronta i prublemi tipici di i sviluppatori chì l'analisi statica pigliarà u so tempu è cusì.

Analisi statica - da l'introduzione à l'integrazione

Se vulete sparte stu articulu cù un publicu anglofonu, per piacè utilizate u ligame di traduzzione: Maxim Zvyagintsev. Analisi statica: da u principiu à l'integrazione.

Source: www.habr.com

Add a comment