Analiza statike – nga njohja deri te integrimi

Statuti nga rishikimi i pafund të kodeve ose debugging, ndonjeherë pyesni veten si ta thjeshtoni jetën tuaj. Dhe pak duke kërkuar, ose ndoshta duke u ndeshur rastësisht, mund të shihni shprehjen magjike: "Analiza statike". Le të shohim çfarë është kjo dhe si mund të ndërveprojë me projektin tuaj.

Analiza statike – nga njohja deri te integrimi
Në fakt, nëse po shkruani në ndonjë gjuhë moderne, atëherë, edhe pa e ditur, keni kaluar atë përmes një analizuesi statik. Problemi është se çdo kompilator modern ofron edhe pse në një formë të vogël, një grup njoftimesh për probleme potenciale në kod. Për shembull, duke kompaktuar kodin C++ në Visual Studio, mund të shihni këtë:

Analiza statike – nga njohja deri te integrimi
Në këtë rezultat shohim se ndryshorja var nuk është përdorur askund në funksion. Pra, në të vërtetë jeni përdorur pothuajse gjithmonë një analizues të thjeshtë statik. Megjithatë, ndryshe nga analizuesit profesionalë si Coverity, Klocwork ose PVS-Studio, njoftimet e ofruara nga kompilatori mund të tregojnë vetëm një spektrin të vogël të problemeve.

Nëse nuk e dini me siguri se çfarë është analiza statike dhe si ta implementoni atë, lexoni këtë artikull, për të mësuar më shumë rreth kësaj metodologjie.

Pse nevojitet analiza statike?

Në dy fjalë: përshpejtim dhe thjeshtim.

Analiza statike lejon gjetjen e një sërë problemeve të ndryshme në kod: duke filluar nga përdorimi i gabuar i strukturave të gjuhës, deri te gabimet e shtypjes. Për shembull, në vend të

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

Keni shkruar kodin e mëposhtëm:

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

Siç e shihni, në rreshtin e fundit ka një gabim shtypi. Për shembull, PVS-Studio jep njoftimin e mëposhtëm:

V537 Merrni parasysh rishikimin e saktësisë së përdorimit të artikullit 'y'.

Nëse dëshironi ta provoni këtë gabim me duar, mund të provoni shembullin e gatshëm në Compiler Explorer: *klik*.

Dhe siç e kuptoni, nuk është gjithmonë e mundur të kushtoni vëmendje për këto pjesë të kodit menjëherë dhe për këtë arsye mund të ngelni të bllokuar në debugging për një kohë të gjatë, duke mos kuptuar pse gjithçka funksionon kaq çuditshëm.

Megjithatë, kjo është një gabim i qartë. Çfarë ndodh nëse zhvilluesi shkruan kod të paoptimal për shkak se harroi ndonjë nuancë të gjuhës? Ose gjithashtu bëri një gabu në kod sjellje të pacaktuar? К сожалению, подобные случаи совершенно обыденны и львиная часть времени тратится на то, чтобы отладить специфично работающий код, который содержит опечатки, типичные ошибки или undefined behavior.

Pikërisht për këto situata u shfaq analiza statike. Kjo është një ndihmësi për zhvilluesit, i cili do t'u tregojë atyre për probleme të ndryshme në kod dhe do të shpjegojë në dokumentacion se pse nuk është e nevojshme të shkruhet ashtu, çfarë mund të sjellë kjo dhe si mund të rregullohet. Ja një shembull se si mund të duket:klik*.

Më shumë gabime interesante që mund të zbulojë analizatori, mund të gjeni në artikujt:

Tani, pas leximit të këtij materiali dhe duke u siguruar për përfitimet e analizës statike, mund të keni dëshirë ta provoni atë në praktikë. Por nga të filloni? Si ta integroni mjetin e ri në projektin aktual? Dhe si t'i prezantoni ekipit? Në këto pyetje do të gjeni përgjigje më poshtë.

Shënim. Analiza statike nuk zëvendëson dhe nuk anulon një gjë kaq të dobishme si rishikimet e kodit. Ajo e plotëson këtë proces, duke ndihmuar në njoftimin dhe korrigjimin paraprak të gabimeve, pasaktësive dhe strukturave të rrezikshme. Është shumë më produktive të përqendroheni gjatë rishikimeve të kodit në algoritmet dhe qartësinë e kodit, sesa në kërkimin e një kllapë të vendosur gabimisht ose leximi i funksioneve të mërzitshme të krahasimit.

0. Njoftimi me mjetin

E gjithë kjo fillon me një version provë. Vërtet, është e vështirë të merrni vendimin për të integruar diçka në procesin e zhvillimit, nëse kurrë nuk e keni parë mjetin në veprim. Pra, gjëja e parë që duhet bërë është shkarkimi versionin provë.

Çfarë do të mësoni në këtë hap:

  • Cilat janë mënyrat e bashkëpunimit me analizatorin;
  • A është analizatori i pajtueshëm me mjedisin tuaj të zhvillimit;
  • Cilat probleme ka aktualisht në projektet tuaja.

Pas instalimit të gjithçkaje të nevojshme, gjëja e parë që duhet bërë është të filloni analizën e gjithë projektit (Windows, Linux, macOS). Në rastin e PVS-Studio në Visual Studio do të shihni një pamje të ngjashme (klikohet):

Analiza statike – nga njohja deri te integrimi
Kjo është një çështje, sepse zakonisht për projektet me një bazë të madhe kodi, analizatorët statikë japin një sasi të madhe paralajmërimesh. Nuk është e nevojshme të korrigjoni të gjitha ato, sepse projekti juaj tashmë funksionon, dhe do të thotë që këto probleme nuk janë kritike. Megjithatë, ju mund të shihni paralajmërimet më interesante dhe t'i rregulloni ato kur është e nevojshme. Për këtë, është e nevojshme të filtroni rezultatin dhe të lini vetëm mesazhet më të besueshme. Në pluginin PVS-Studio për Visual Studio, kjo bëhet duke filtruar sipas niveleve dhe kategorive të gabimeve. Për rezultatin më të saktë, lërini të përfshirë vetëm I Lartë dhe Përgjithshëm (po ashtu klikueshme):

Analiza statike – nga njohja deri te integrimi
Me të vërtetë, të shikosh 178 paralajmërime është shumë më e lehtë se sa disa mijëra…

Në tabs Mesatar dhe I Ulët shpesh hasen paralajmërime të mira, megjithatë në këto kategori janë përfshirë ato diagnostikime që kanë saktësi më të ulët. Më shumë mbi nivelet e paralajmërimeve dhe opsionet e punës nën Windows mund të shihni këtu: *klik*.

Pas përfundimit të shqyrtimit të gabimeve më interesante (dhe pas përmirësimit të tyre) ia vlen të shuen paralajmërimet e mbetura. Kjo është e nevojshme në mënyrë që paralajmërimet e reja të mos humbasin mes atyre të vjetra. Për më tepër, analizuesi statik është një ndihmës për programuesin, dhe jo një listë për defekte. 🙂

1. Automatizimi

Pas njohjes, vjen koha për konfigurimin e pluginave dhe integrimin në CI. Kjo duhet të bëhet para se programuesit të fillojnë të përdorin analizuesin statik. E gjithë historia është që programuesi mund të harrojë të aktivizojë analizën ose të mos dëshirojë fare. Për këtë, është e nevojshme të bëni një kontroll përfundimtar të gjithçkaje, në mënyrë që kodi i paanalizuar të mos arrijë në degën e përbashkët të zhvillimit.

Çfarë do të thoni në këtë fazë:

  • Cilat janë opsionet e automatizimit që ofron instrumenti;
  • A është analizuesi i përputhshëm me sistemin tuaj të ndërtimit.

Sepse nuk ekziston dokumentacion ideal, ndonjëherë duhet të shkruani në mbështetje. Është në rregull, dhe ne jemi të lumtur t'ju ndihmojmë. 🙂

Tani le të flasim për shërbimet e integrimit të vazhdueshëm (CI). Çdo analizues mund të integrohet në to pa ndonjë problem të rëndësishëm. Për këtë, është e nevojshme të krijohet një fazë e veçantë në pipeline, e cila zakonisht ndodhet pas ndërtimit dhe testeve unitare. Kjo bëhet me ndihmën e utilitarëve të ndryshëm të konsolës. Për shembull, PVS-Studio ofron utilitarët e mëposhtëm:

Për të integruar analizën në CI, janë të nevojshme tre gjëra:

  • Instaloni analizuesin;
  • Nisni analizën;
  • Dorëzoni rezultatet.

Për shembull, për të instaluar PVS-Studio në Linux (baze Debian), duhet të ekzekutoni komandat e mëposhtme:

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

Në sistemet që drejtohen nga Windows, nuk ka mundësi të instaloni analizuesin nga menaxheri i pakot, megjithatë, ka mundësi të implementoni analizuesin nga linja e komandës:

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

Për më shumë informacion rreth implementimit të PVS-Studio në sistemet që drejtohen nga Windows, mund të lexoni *këtu*.

Pas instalimit, duhet të nisni analizën në vetvete. Megjithatë, rekomandohet që të bëni këtë vetëm pasi të përfundojë kompaktimi dhe testet. Kjo lidhet me faktin se për analizën statike zakonisht kërkohet dy herë më shumë kohë sesa për kompaktim.

Duke pasur parasysh që mënyra e nisjes varet nga platforma dhe veçoritë e projektit, do të tregoj një mënyrë për C++ (Linux) si një shembull:

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

Komanda e parë do të ekzekutojë analizën, ndërsa e dyta konvertonraportin në format tekstual, do ta shfaqë atë në ekran dhe do të kthejë një kod kthimi të ndryshëm nga 0 në rastin e paralajmërimeve. Një mekanizëm i tillë është i përshtatshëm për të bllokuar ndërtimin në rastin e mesazheve të gabimeve. Megjithatë, gjithmonë mund ta hiqni flamurin -w dhe të mos bllokoni ndërtimin që përmban paralajmërime.

Shënim. Formati tekstual është i pakëndshëm. Ky jepet thjesht si shembull. Vini re formatin më interesant të raportit - FullHtml. Ai lejon navigimin nëpër kod.

Për më shumë informacion rreth konfigurimit të analizës në CI, mund të lexoni artikullin "PVS-Studio dhe Continuous Integration" (Windows) ose "Si të konfiguroni PVS-Studio në Travis CI" (Linux).

Mirë, keni konfiguruar funksionimin e analizuesit në serverin e ndërtimit. Tani, nëse dikush ka ngarkuar kod të pa verifikuar, do të dështojë faza e kontrollit dhe ju do të jeni në gjendje të identifikoni problemin, megjithatë kjo nuk është shumë e përshtatshme, pasi është më efektive të kontrolloni projektin para se të ndodhi bashkimi i degëve, në fazën e pull request.

Në përgjithësi, konfigurimi i analizës së pull request-it nuk ndryshon shumë nga nisja e zakonshme e analizës në CI. Përveç nevojës për të marrë listën e skedareve të modifikuara. Zakonisht ato mund të merren duke kërkuar ndryshimin midis degëve nëpërmjet git:

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

Tani duhet të kaloni këtë lista e skedareve në analizator. Për shembull, në PVS-Studio kjo është implementuar me ndihmën e flagut -S:

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

Më shumë rreth analizës së pull request'ave mund të mësoni *këtu*. Edhe nëse CI tuaj nuk ndodhet në listën e shërbimeve të përmendura në artikull, do t'ju ndihmojë seksioni i përgjithshëm, e cila i kushtohet teorisë së këtij lloji të analizës.

Duke konfiguruar analizën e pull request'ave, do të jeni në gjendje të bllokoni komitetet që përmbajnë paralajmërime, duke krijuar kështu një kufi, që kodi i pavlerësuar nuk mund ta kalojë.

Kjo është pa dyshim shumë mirë, por do të doja të kisha mundësi të shihja të gjitha paralajmërimet në një vend. Jo vetëm nga analizatori statik, por edhe nga testet njësive ose nga analizatori dinamik. Për këtë ekzistojnë shërbime dhe plugina të ndryshme. PVS-Studio, për shembull, ka plugin për integrimin në SonarQube.

2. Integrimi në makinat e zhvilluesve

Tani është koha për të instaluar dhe konfiguruar analizatorin për përdorim në përditshmëri gjatë zhvillimit. Në këtë pikë, keni njohur me shumicën e mënyrave të punës, prandaj kjo mund të quhet pjesa më e lehtë.

Si opsioni më i thjeshtë - zhvilluesit vetë mund të instalojnë analizatorin e nevojshëm. Megjithatë, kjo do të marrë shumë kohë dhe do t'i tërheqë ata nga zhvillimi, prandaj mund ta automatizoni këtë proces duke përdorur një instalues dhe flagat e nevojshme. Për PVS-Studio ka verschiedene flagat për instalim automatizues. Megjithatë, gjithmonë ka menaxherë paketa, siç janë Chocolatey (Windows), Homebrew (macOS) ose dhjetëra variante për Linux.

Pastaj duhet të instaloni plugina të nevojshme, për shembull, për Visual Studio, IDEA, Rider et cetera

3. Përdorim të përditshëm

Në këtë fazë është koha të themi disa fjalë rreth mënyrave për të përshpejtuar punën e analizatorit gjatë përdorimit të përditshëm. Analiza e plotë e tërë projektit merr shumë kohë, por sa shpesh ndryshojmë kodin gjithashtu në të gjithë projektin? Ka vështirësi për aq shumë riorganizim që prek menjëherë të gjithë bazën e kodit. Numri i skedareve që ndryshojmë njëherësh rrallë kalon dhjetë, kështu që ka kuptim të analizohen. Për një situatë të tillë ekziston reagimi i analizës inkrementale. Mos u trembni, nuk është një tjetër mjet. Ky është një mod special që lejon analizimin vetëm të skedave të ndryshuara dhe varësive të tyre, dhe kjo ndodh automatikisht pas ndërtimit, nëse po punoni në IDE me plugin të instaluar.

Në rast se analizatori zbulon probleme në kodin e sapo ndryshuar, ai do t'ju njoftojë vetë. Për shembull, PVS-Studio do t'ju njoftojë nëpërmjet një paralajmërimi:

Analiza statike – nga njohja deri te integrimi
Natyrisht, nuk është e mjaftueshme të thuash zhvilluesve të përdorin mjetin. Duhet ndonjëherë t'u tregosh atyre se çfarë është kjo dhe si përdoret. Ja, për shembull, artikuj mbi fillimin e shpejtë për PVS-Studio, megjithatë, mund të gjeni tutje tutori për çdo mjet tjetër që preferoni:

Artikuj të tillë ofrojnë të gjitha informacionet e nevojshme për përdorim të përditshëm dhe nuk e zënë shumë kohë. 🙂

Edhe në fazën e njohjes me mjetin, ne kemi heshtur shumë paralajmërime gjatë një prej njoftimeve të para. Fatkeqësisht, analizatorët statikë nuk janë perfekt, prandaj ndonjëherë japin alarme false. Heshtja e tyre zakonisht është e lehtë, për shembull, në pluginin PVS-Studio për Visual Studio, mjafton të shtypni vetëm një buton:

Analiza statike – nga njohja deri te integrimi
Megjithatë, ju mund të mos heshtni vetëm. Për shembull, mund të njoftoni mbështetje për një problem që ekziston. Nëse një alarm false mund të rregullohet, atëherë në përditësimet e ardhshme mund të vini re se me kalimin e kohës bëhet gjithnjë e më pak specifik për bazën tuaj të kodit.

Pas integrimit

Tani ne kemi përfunduar të gjithë hapat për integrimin e analizës statike në procesin e zhvillimit. Megjithëse rëndësia e konfigurimit të mjeteve të tilla në CI është e madhe, vendi më i rëndësishëm për nisjen është kompjuteri i zhvilluesit. Sepse analizatori statik nuk është një gjyqtar që thotë diku larg jush se kodi nuk është i këndshëm. Përkundrazi, është një ndihmës që ju udhëzon nëse jeni të lodhur dhe ju kujton nëse keni harruar ndonjë gjë.

E vërteta është se pa përdorim të rregullt, analiza statike nuk do ta thjeshtojë ndjeshëm zhvillimin. Përfitimi më i madh i saj për zhvilluesin nuk qëndron aq shumë në gjetjen e pjesëve të kodit të komplikuara dhe të diskutueshme, sa në zbulimin e hershëm të tyre. Pranoni se është jo vetëm e pakëndshme, por edhe shumë e gjatë të zbulosh një problem kur ndryshimet janë dërguar për testim. Analiza statike, megjithatë, duke u përdorur rregullisht, shqyrton çdo ndryshim direkt në kompjuterin tuaj dhe njofton për vendet e dyshimta gjatë punës mbi kodin.

Dhe nëse ju ose kolegët tuaj ende nuk jeni të sigurt nëse duhet të implementoni një analizator, atëherë ju sugjeroj të kaloni tani në leximin e artikullit "Arsyet për të implementuar një analizator statik të kodit PVS-Studio në procesin e zhvillimit". Në të, shqyrtohen shqetësimet tipike të zhvilluesve se analiza statike do të merrte kohën e tyre dhe kështu me radhë.

Analiza statike – nga njohja deri te integrimi

Nëse dëshironi ta ndani këtë artikull me një audiencë anglishtfolëse, ju lutem përdorni linkun për përkthimin: Maxim Zvyagintsev. Analiza Statike: Nga Fillimi deri në Integrim.

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster