Ġejt imqanqal nikteb dan l-artikolu mill-ammont kbir ta 'materjali fuq analiżi statika li qed jiġu dejjem aktar għall-attenzjoni tiegħi. L-ewwelnett, dan , li jippromwovi b'mod attiv fuq Habré bl-għajnuna ta 'reviżjonijiet ta' żbalji misjuba mill-għodda tagħhom fi proġetti open source. Riċentement PVS-studio implimentat , u, ovvjament, l-iżviluppaturi ta 'IntelliJ IDEA, li l-analizzatur inkorporat tiegħu huwa probabbilment l-aktar avvanzat għal Java llum, .
Meta taqra reviżjonijiet bħal dawn, ikollok is-sensazzjoni li qed nitkellmu dwar elixir maġiku: agħfas il-buttuna, u hawnhekk hija - lista ta 'difetti quddiem għajnejk. Jidher li hekk kif l-analizzaturi jitjiebu, awtomatikament jinstabu aktar u aktar bugs, u l-prodotti skennjati minn dawn ir-robots isiru aħjar u aħjar, mingħajr ebda sforz min-naħa tagħna.
Iżda m'hemm l-ebda elixirs magic. Nixtieq nitkellem dwar dak li normalment ma jitkellimx dwaru f'postijiet bħal "hawn huma l-affarijiet li jista' jsib ir-robot tagħna": x'ma jistgħux jagħmlu l-analizzaturi, x'inhu r-rwol u l-post reali tagħhom fil-proċess tal-kunsinna tas-softwer, u kif jimplimentawhom b'mod korrett .

Ratchet (sors: ).
Liema analizzaturi statiċi qatt ma jistgħu jagħmlu
X'inhi l-analiżi tal-kodiċi tas-sors, mil-lat prattiku? Nipprovdu xi kodiċi tas-sors bħala input, u bħala output, fi żmien qasir (ħafna iqsar mit-twettiq tat-testijiet) niksbu xi informazzjoni dwar is-sistema tagħna. Il-limitazzjoni fundamentali u matematikament insormontabbli hija li nistgħu niksbu biss klassi pjuttost dejqa ta 'informazzjoni b'dan il-mod.
L-aktar eżempju famuż ta 'problema li ma tistax tiġi solvuta bl-użu ta' analiżi statika huwa : Din hija teorema li tipprova li huwa impossibbli li jiġi żviluppat algoritmu ġenerali li jista 'jiddetermina mill-kodiċi sors ta' programm jekk hux se loop jew jintemm fi żmien finit. Estensjoni ta' din it-teorema hija , li jiddikjara li għal kwalunkwe proprjetà mhux trivjali ta 'funzjonijiet komputabbli, id-determinazzjoni ta' jekk programm arbitrarju jevalwax funzjoni b'tali proprjetà hija problema algoritmikament intrattabbli. Pereżempju, huwa impossibbli li tikteb analizzatur li jista 'jiddetermina minn kwalunkwe kodiċi sors jekk il-programm li qed jiġi analizzat huwiex implimentazzjoni ta' algoritmu li jikkalkula, ngħidu aħna, il-kwadru ta 'numru sħiħ.
Għalhekk, il-funzjonalità tal-analizzaturi statiċi għandha limitazzjonijiet insormontabbli. Analizzatur statiku qatt mhu se jkun jista 'jsib fil-każijiet kollha affarijiet bħal, pereżempju, l-okkorrenza ta' "eċċezzjoni ta 'pointer null" f'lingwi li jippermettu l-valur ta' null, jew fil-każijiet kollha biex jiddetermina l-okkorrenza ta '" attribut mhux misjub" f'lingwi ttajpjati b'mod dinamiku. Dak kollu li jista 'jagħmel l-analizzatur statiku l-aktar avvanzat huwa jenfasizza każijiet speċjali, li n-numru tagħhom, fost il-problemi kollha possibbli bil-kodiċi tas-sors tiegħek, huwa, mingħajr esaġerazzjoni, qatra fl-oċean.
Analiżi statika mhix dwar is-sejba ta 'bugs
Minn dan ta 'hawn fuq, issegwi l-konklużjoni: l-analiżi statika mhix mezz biex jitnaqqas in-numru ta' difetti fi programm. Nixtieq ngħid: meta applikat għall-proġett tiegħek għall-ewwel darba, se jsib postijiet "interessanti" fil-kodiċi, iżda, x'aktarx, ma jsib ebda difett li jaffettwa l-kwalità tal-programm tiegħek.
L-eżempji ta 'difetti misjuba awtomatikament mill-analizzaturi huma impressjonanti, iżda m'għandniex ninsew li dawn l-eżempji nstabu billi skennjaw sett kbir ta' codebases kbar. Bl-istess prinċipju, il-hackers li għandhom l-opportunità li jippruvaw diversi passwords sempliċi fuq numru kbir ta 'kontijiet eventwalment isibu dawk il-kontijiet li għandhom password sempliċi.
Dan ifisser li m'għandhiex tintuża analiżi statika? Mhux ovvja li le! U eżattament għall-istess raġuni li ta 'min iċċekkja kull password ġdida biex tiżgura li hija inkluża fil-lista ta' waqfien ta 'passwords "sempliċi".
L-analiżi statika hija aktar milli ssib bugs
Fil-fatt, il-problemi prattikament solvuti bl-analiżi huma ħafna usa'. Wara kollox, b'mod ġenerali, l-analiżi statika hija kwalunkwe verifika tal-kodiċijiet tas-sors imwettqa qabel ma jiġu mnedija. Hawn huma xi affarijiet li tista 'tagħmel:
- Iċċekkjar stil ta 'kodifikazzjoni fl-aktar sens wiesa' tal-kelma. Dan jinkludi kemm il-kontroll tal-ifformattjar, it-tiftix għall-użu ta 'parentesi vojta/extra, l-iffissar ta' limiti fuq metriċi bħal numru ta 'linji/kumplessità ċiklomatika ta' metodu, eċċ. - kull ħaġa li potenzjalment timpedixxi l-leġġibbiltà u l-mantenibbiltà tal-kodiċi. F'Java, għodda bħal din hija Checkstyle, f'Python - flake8. Programmi ta’ din il-klassi normalment jissejħu “linters.”
- Mhux biss kodiċi eżekutibbli jista 'jiġi analizzat. Fajls tar-riżorsi bħal JSON, YAML, XML, .properties jistgħu (u għandhom!) jiġu kkontrollati awtomatikament għall-validità. Wara kollox, huwa aħjar li ssir taf li l-istruttura JSON hija miksura minħabba xi kwotazzjonijiet mhux imqabbla fi stadju bikri ta 'verifika awtomatika Pull Request milli waqt l-eżekuzzjoni tat-test jew run time? Għodod xierqa huma disponibbli: eż. , .
- Il-kumpilazzjoni (jew parsing għal lingwi ta' programmar dinamiċi) hija wkoll tip ta' analiżi statika. B'mod ġenerali, il-kompilaturi huma kapaċi jipproduċu twissijiet li jindikaw problemi bil-kwalità tal-kodiċi tas-sors u m'għandhomx jiġu injorati.
- Xi drabi l-kumpilazzjoni hija aktar milli sempliċement il-kumpilazzjoni ta 'kodiċi eżekutibbli. Per eżempju, jekk għandek dokumentazzjoni fil-format , imbagħad fil-mument li tinbidel f'HTML/PDF il-handler AsciiDoctor () jistgħu joħorġu twissijiet, pereżempju, dwar links interni miksura. U din hija raġuni tajba biex ma taċċettax il-Pull Request b'bidliet fid-dokumentazzjoni.
- Il-kontroll tal-ortografija huwa wkoll tip ta' analiżi statika. Utilità huwa kapaċi jiċċekkja l-ortografija mhux biss fid-dokumentazzjoni, iżda wkoll fil-kodiċi tas-sors tal-programm (kummenti u letterali) f'diversi lingwi ta 'programmar, inklużi C/C++, Java u Python. Żball ortografiku fl-interface tal-utent jew fid-dokumentazzjoni huwa wkoll difett!
- Testijiet tal-konfigurazzjoni (dwar x'inhuma - ara. и rapporti), għalkemm esegwiti f’runtime ta’ test unitarju bħal pytest, huma fil-fatt ukoll tip ta’ analiżi statika, peress li ma jeżegwixxux kodiċi tas-sors waqt l-eżekuzzjoni tagħhom.
Kif tistgħu taraw, it-tiftix għal bugs f'din il-lista għandu l-inqas rwol importanti, u kull ħaġa oħra hija disponibbli billi tuża għodod b'xejn ta 'sors miftuħ.
Liema minn dawn it-tipi ta 'analiżi statika għandek tuża fil-proġett tiegħek? Naturalment, iktar ma jkun aħjar! Il-ħaġa prinċipali hija li timplimentaha b'mod korrett, li se tiġi diskussa aktar.
Pipeline ta 'konsenja bħala filtru f'diversi stadji u analiżi statika bħala l-ewwel stadju tagħha
Il-metafora klassika għall-integrazzjoni kontinwa hija pipeline li permezz tiegħu l-bidliet jiċċirkolaw, minn bidliet fil-kodiċi tas-sors għall-kunsinna għall-produzzjoni. Is-sekwenza standard tal-istadji f'dan il-pipeline tidher bħal din:
- analiżi statika
- kumpilazzjoni
- testijiet tal-unità
- testijiet ta' integrazzjoni
- Testijiet UI
- kontroll manwali
Bidliet miċħuda fl-Nth stadju tal-pipeline ma jiġux trasferiti għall-istadju N+1.
Għaliex eżattament hekk u mhux mod ieħor? Fil-parti tal-ittestjar tal-pipeline, dawk li jittestjaw se jirrikonoxxu l-piramida tal-ittestjar magħrufa.

Test piramida. Sors: Martin Fowler.
Fil-qiegħ ta 'din il-piramida hemm testijiet li huma aktar faċli biex tikteb, aktar mgħaġġla biex tesegwixxi, u m'għandhomx tendenza li jfallu. Għalhekk, għandu jkun hemm aktar minnhom, għandhom ikopru aktar kodiċi u jiġu esegwiti l-ewwel. Fil-quċċata tal-piramida, l-oppost huwa minnu, għalhekk in-numru ta 'testijiet ta' integrazzjoni u UI għandu jitnaqqas għall-minimu meħtieġ. Il-persuna f'din il-katina hija l-aktar riżorsa għalja, bil-mod u mhux affidabbli, għalhekk tinsab fl-aħħar nett u twettaq ix-xogħol biss jekk l-istadji preċedenti ma sabu l-ebda difett. Madankollu, l-istess prinċipji jintużaw biex jinbena pipeline f'partijiet mhux relatati direttament mal-ittestjar!
Nixtieq noffri analoġija fil-forma ta 'sistema ta' filtrazzjoni ta 'l-ilma f'diversi stadji. Ilma maħmuġ (bidliet bid-difetti) jiġi fornut lill-input; fl-output irridu nirċievu ilma nadif, li fih il-kontaminanti mhux mixtieqa kollha ġew eliminati.

Filtru f'diversi stadji. Sors:
Kif tafu, il-filtri tat-tindif huma ddisinjati sabiex kull kaskata sussegwenti tista 'tiffiltra frazzjoni dejjem aktar fina ta' kontaminanti. Fl-istess ħin, kaskati ta 'purifikazzjoni oħxon għandhom throughput ogħla u spiża aktar baxxa. Fl-analoġija tagħna, dan ifisser li l-gradi tal-kwalità tal-input huma aktar mgħaġġla, jeħtieġu inqas sforz biex jibdew, u huma stess huma aktar mingħajr pretenzjoni fl-operazzjoni - u din hija s-sekwenza li fiha huma mibnija. Ir-rwol tal-analiżi statika, li, kif nifhmu issa, huwa kapaċi li jneħħi biss l-akbar difetti, huwa r-rwol tal-grilja "tajn" fil-bidu nett tal-kaskata tal-filtru.
L-analiżi statika waħedha ma ttejjebx il-kwalità tal-prodott finali, bħalma "filtru tat-tajn" ma jagħmilx l-ilma tajjeb għax-xorb. U madankollu, flimkien ma 'elementi oħra tal-pipeline, l-importanza tagħha hija ovvja. Għalkemm f'filtru b'ħafna stadji l-istadji tal-ħruġ huma potenzjalment kapaċi li jaqbdu dak kollu li jagħmlu l-istadji tal-input, huwa ċar liema konsegwenzi se jirriżultaw minn tentattiv biex tagħmel tajjeb ma 'stadji ta' purifikazzjoni multa waħedhom, mingħajr stadji ta 'input.
L-iskop tan-"nasba tat-tajn" huwa li teħles kaskati sussegwenti milli jaqbdu difetti kbar ħafna. Pereżempju, bħala minimu, il-persuna li tagħmel ir-reviżjoni tal-kodiċi m'għandhiex tkun distratta minn kodiċi ifformattjat b'mod żbaljat u vjolazzjonijiet ta 'standards ta' kodifikazzjoni stabbiliti (bħal parentesi żejda jew fergħat ibdew wisq fil-fond). Bugs bħal NPEs għandhom jinqabdu minn testijiet ta 'unità, iżda jekk anki qabel it-test l-analizzatur jindikalna li bug huwa marbut li jseħħ, dan iħaffef b'mod sinifikanti l-iffissar tiegħu.
Nemmen li issa huwa ċar għaliex l-analiżi statika ma ttejjebx il-kwalità tal-prodott jekk tintuża okkażjonalment, u għandha tintuża kontinwament biex tiffiltra l-bidliet b'difetti kbar. Il-mistoqsija dwar jekk l-użu ta 'analizzatur statiku jtejjebx il-kwalità tal-prodott tiegħek hija bejn wieħed u ieħor ekwivalenti għal mistoqsija, "L-ilma meħud minn għadira maħmuġa se jitjieb fil-kwalità tax-xorb jekk jgħaddi minn colander?"
Implimentazzjoni fi proġett legat
Mistoqsija prattika importanti: kif timplimenta analiżi statika fil-proċess ta 'integrazzjoni kontinwa bħala "bieb tal-kwalità"? Fil-każ ta 'testijiet awtomatiċi, kollox huwa ovvju: hemm sett ta' testijiet, in-nuqqas ta 'xi wieħed minnhom huwa raġuni biżżejjed biex wieħed jemmen li l-assemblaġġ ma għaddax mill-bieb tal-kwalità. Attentat biex tinstalla xatba bl-istess mod ibbażat fuq ir-riżultati ta 'analiżi statika jonqos: hemm wisq twissijiet ta' analiżi fil-kodiċi tal-legat, ma tridx tinjorahom kompletament, iżda huwa wkoll impossibbli li tieqaf tbaħħir prodott sempliċiment għax fih twissijiet tal-analizzatur.
Meta jintuża għall-ewwel darba, l-analizzatur jipproduċi numru kbir ta 'twissijiet fuq kwalunkwe proġett, li l-maġġoranza l-kbira tagħhom mhumiex relatati mal-funzjonament tajjeb tal-prodott. Huwa impossibbli li dawn il-kummenti kollha jiġu kkoreġuti f'daqqa, u ħafna mhumiex meħtieġa. Wara kollox, nafu li l-prodott tagħna kollu jaħdem, anke qabel ma nintroduċi analiżi statika!
Bħala riżultat, ħafna huma limitati għal użu okkażjonali ta 'analiżi statika, jew jużawha biss fil-modalità ta' informazzjoni, meta rapport tal-analizzatur jinħareġ sempliċement waqt l-assemblaġġ. Dan huwa ekwivalenti għan-nuqqas ta 'kwalunkwe analiżi, għaliex jekk diġà għandna ħafna twissijiet, allura l-okkorrenza ta' oħra (irrispettivament minn kemm tkun serja) meta tinbidel il-kodiċi ma tibqax inosservata.
Il-metodi li ġejjin ta 'introduzzjoni ta' gradi ta 'kwalità huma magħrufa:
- L-issettjar ta' limitu fuq in-numru totali ta' twissijiet jew in-numru ta' twissijiet diviż bin-numru ta' linji ta' kodiċi. Dan jaħdem ħażin, minħabba li bieb bħal dan jippermetti liberament li jgħaddu bidliet b'difetti ġodda, sakemm il-limitu tagħhom ma jinqabiżx.
- L-iffissar, f'ċertu mument, tat-twissijiet qodma kollha fil-kodiċi bħala injorati, u rrifjuta li jibni meta jseħħu twissijiet ġodda. Din il-funzjonalità hija pprovduta minn PVS-studio u xi riżorsi onlajn, pereżempju, Codacy. Ma kellix l-opportunità li naħdem fi PVS-studio, kif għall-esperjenza tiegħi ma 'Codacy, il-problema ewlenija tagħhom hija li d-determinazzjoni ta' x'inhu żball "antik" u x'inhu żball "ġdid" huwa algoritmu pjuttost kumpless li mhux dejjem jaħdem b'mod korrett, speċjalment jekk il-fajls huma modifikati ħafna jew jisimhom mill-ġdid. Fl-esperjenza tiegħi, Codacy seta' jinjora twissijiet ġodda f'talba tal-ġibda, filwaqt li fl-istess ħin ma jgħaddix talba tal-ġibda minħabba twissijiet li ma kinux relatati ma 'bidliet fil-kodiċi ta' PR partikolari.
- Fl-opinjoni tiegħi, l-aktar soluzzjoni effettiva hija dik deskritta fil-ktieb “metodu ta’ ratcheting”. L-idea bażika hija li n-numru ta 'twissijiet ta' analiżi statika huwa proprjetà ta 'kull rilaxx, u huma permessi biss bidliet li ma jżidux in-numru totali ta' twissijiet.
Ratchet
Taħdem b'dan il-mod:
- Fl-istadju inizjali, isir rekord fil-metadata dwar ir-rilaxx tan-numru ta 'twissijiet fil-kodiċi misjuba mill-analizzaturi. Allura, meta tibni upstream, il-maniġer tar-repożitorju tiegħek jikteb mhux biss "rilaxx 7.0.2", iżda "rilaxx 7.0.2 li jkun fih 100500 twissija ta 'stil ta' kontroll." Jekk tuża maniġer tar-repożitorju avvanzat (bħal Artifactory), il-ħażna ta' metadata bħal din dwar ir-rilaxx tiegħek hija faċli.
- Issa kull talba tal-ġibda, meta tinbena, tqabbel in-numru ta 'twissijiet li jirriżultaw man-numru ta' twissijiet disponibbli fir-rilaxx attwali. Jekk il-PR iwassal għal żieda f'dan in-numru, allura l-kodiċi ma jgħaddix mill-bieb tal-kwalità għall-analiżi statika. Jekk in-numru ta 'twissijiet jonqos jew ma jinbidilx, allura jgħaddi.
- Fir-rilaxx li jmiss, in-numru ikkalkulat mill-ġdid ta' twissijiet se jerġa' jiġi rreġistrat fil-metadejta tar-rilaxx.
Allura ftit ftit iżda b'mod kostanti (bħal meta jaħdem ratchet), in-numru ta 'twissijiet għandu t-tendenza għal żero. Naturalment, is-sistema tista 'tiġi mqarrqa billi tintroduċi twissija ġdida, iżda tikkoreġi xi ħadd ieħor. Dan huwa normali, għaliex fuq distanza twila jagħti riżultati: it-twissijiet huma kkoreġuti, bħala regola, mhux individwalment, iżda fi grupp ta 'ċertu tip f'daqqa, u t-twissijiet kollha li jistgħu jitneħħew faċilment huma eliminati pjuttost malajr.
Din il-grafika turi n-numru totali ta 'twissijiet ta' Checkstyle għal sitt xhur ta 'tħaddim ta' "ratchet" bħal dan . In-numru ta 'twissijiet naqas b'ordni ta' kobor, u dan ġara b'mod naturali, b'mod parallel mal-iżvilupp tal-prodott!

Jiena nuża verżjoni modifikata ta' dan il-metodu, billi ngħodd separatament it-twissijiet skont il-modulu tal-proġett u l-għodda tal-analiżi, li tirriżulta f'fajl YAML b'metadejta tal-bini li tidher xi ħaġa bħal din:
celesta-sql:
checkstyle: 434
spotbugs: 45
celesta-core:
checkstyle: 206
spotbugs: 13
celesta-maven-plugin:
checkstyle: 19
spotbugs: 0
celesta-unit:
checkstyle: 0
spotbugs: 0
Fi kwalunkwe sistema CI avvanzata, ratchet jista 'jiġi implimentat għal kwalunkwe għodda ta' analiżi statika mingħajr ma tiddependi fuq plugins u għodod ta 'partijiet terzi. Kull analizzatur jipproduċi r-rapport tiegħu stess f'test sempliċi jew format XML li huwa faċli biex jiġi analizzat. Li jibqa 'huwa li tikteb il-loġika meħtieġa fl-iskrittura CI. Tista 'tara kif dan huwa implimentat fil-proġetti ta' sors miftuħ tagħna bbażati fuq Jenkins u Artifactory jew . Iż-żewġ eżempji jiddependu fuq il-librerija : metodu countWarnings() jgħodd it-tikketti xml fil-fajls ġġenerati minn Checkstyle u Spotbugs bil-mod tas-soltu, u compareWarningMaps() jimplimenta l-istess ratchet, li jitfa' żball meta n-numru ta 'twissijiet f'xi waħda mill-kategoriji jiżdied.
Implimentazzjoni interessanti tal-"ratchet" hija possibbli għall-analiżi tal-ortografija tal-kummenti, it-test letterali u d-dokumentazzjoni bl-użu ta 'aspell. Kif tafu, meta tiċċekkja l-ortografija, mhux il-kliem kollu mhux magħruf mid-dizzjunarju standard huwa żbaljat; jistgħu jiżdiedu mad-dizzjunarju tal-utent. Jekk tagħmel dizzjunarju tad-dwana parti mill-kodiċi tas-sors tal-proġett, allura l-bieb tal-kwalità tal-ortografija jista 'jiġi fformulat b'dan il-mod: tħaddim ta' aspell b'dizzjunarju standard u personalizzat ma ssibx żbalji ortografiċi.
Dwar l-importanza li tiġi ffissata l-verżjoni tal-analizzatur
Bħala konklużjoni, il-punt li wieħed jinnota huwa li ma jimpurtax kif timplimenta l-analiżi fil-pipeline tal-kunsinna tiegħek, il-verżjoni tal-analizzatur trid tiġi ffissata. Jekk tippermetti lill-analizzatur jaġġorna b'mod spontanju, allura meta tgħaqqad it-talba tal-ġibda li jmiss, difetti ġodda jistgħu "jqumu" li mhumiex relatati mal-bidliet fil-kodiċi, iżda huma relatati mal-fatt li l-analizzatur il-ġdid huwa sempliċement kapaċi jsib aktar difetti - u dan se jkisser il-proċess tiegħek ta 'aċċettazzjoni talbiet pull. It-titjib ta' analizzatur għandu jkun azzjoni konxja. Madankollu, l-iffissar riġidu tal-verżjoni ta 'kull komponent ta' assemblaġġ huwa ġeneralment rekwiżit meħtieġ u suġġett għal diskussjoni separata.
Sejbiet
- L-analiżi statika mhux se ssib bugs għalik u mhux se ttejjeb il-kwalità tal-prodott tiegħek bħala riżultat ta 'applikazzjoni waħda. Effett pożittiv fuq il-kwalità jista 'jinkiseb biss permezz tal-użu kostanti tiegħu matul il-proċess tal-kunsinna.
- Is-sejbien tal-bugs mhu l-kompitu ewlieni tal-analiżi; il-maġġoranza l-kbira tal-funzjonijiet utli huma disponibbli f'għodod opensource.
- Implimenta xtiebi ta 'kwalità bbażati fuq ir-riżultati ta' analiżi statika fl-ewwel stadju tal-pipeline tal-kunsinna, bl-użu ta '"ratchet" għal kodiċi legacy.
referenzi
- rapport dwar metodi differenti ta 'analiżi tal-kodiċi (mhux biss statiku!)
Sors: www.habr.com
