Aplike analiz estatik nan pwosesis la, olye ke chèche pinèz ak li

Mwen te enspire pou ekri atik sa a pa yon gwo kantite materyèl sou analiz estatik ki de pli zan pli vini atravè. Premyèman, sa a PVS-estidyo blog, ki aktivman ankouraje tèt li sou Habré ak revizyon nan erè yo te jwenn nan zouti yo nan pwojè sous louvri. PVS-studio dènyèman aplike Java sipò, epi, nan kou, devlopè IntelliJ IDEA, ki gen analizè entegre se pwobableman pi avanse pou Java jodi a, pa t 'kapab rete lwen.

Lè w li revizyon sa yo, yon moun vin santi ke nou ap pale de yon eliksir majik: peze bouton an, epi isit la li ye - yon lis defo devan je ou. Li sanble ke kòm analizeur yo amelyore, pral otomatikman gen plis ak plis pinèz, ak pwodwi yo analize pa robo sa yo ap vin pi bon ak pi bon, san okenn efò sou pati nou an.

Men, pa gen okenn eliksir majik. Mwen ta renmen pale sou sa ki anjeneral pa diskite nan pòs tankou "Men bagay sa yo robo nou an ka jwenn": ki sa analizè pa ka fè, ki wòl reyèl yo ak plas yo nan pwosesis livrezon lojisyèl an, ak ki jan yo aplike yo kòrèkteman.

Aplike analiz estatik nan pwosesis la, olye ke chèche pinèz ak li
Ratchet (sous: wikipedia).

Ki sa ki analizè estatik pa janm ka fè

Ki sa ki, nan yon pwen de vi pratik, analiz kòd sous? Nou manje nan kèk sous, ak nan yon ti tan (pi kout pase tès kouri) nou jwenn kèk enfòmasyon sou sistèm nou an. Limit fondamantal ak matematik enfranchisabl se ke nou ka konsa jwenn sèlman yon klas enfòmasyon ki pito etwat.

Egzanp ki pi popilè nan yon pwoblèm ki pa ka rezoud pa analiz estatik se sispann pwoblèm: sa a se yon teyorèm ki pwouve ke li enposib pou devlope yon algorithm jeneral ki ta detèmine nan kòd sous la nan pwogram nan si li pral bouk oswa fini nan yon tan fini. Yon ekstansyon teyorèm sa a se Teyorèm Rice aki deklare ke pou nenpòt pwopriyete ki pa trivial nan fonksyon enfòmatik, detèmine si yon pwogram abitrè evalye yon fonksyon ak yon pwopriyete sa a se yon pwoblèm algoritmik ki pa ka rezoud. Pou egzanp, li enposib ekri yon analizè ki ka detèmine nan nenpòt kòd sous si pwogram nan analize se yon aplikasyon nan yon algorithm ki kalkile, di, kare yon nonb antye relatif.

Kidonk, fonksyonalite analizè estatik yo gen limit enfranchisabl. Yon analizè estatik p'ap janm ka detèmine nan tout ka bagay sa yo tankou, pou egzanp, ensidan an nan "eksepsyon pointer nil" nan lang nullable, oswa nan tout ka detèmine ensidan an nan "atribi pa jwenn" nan lang ak sezisman dinamik. Tout sa ki pi avanse analizè estatik la ka fè se mete aksan sou ka espesyal, ki kantite ki, pami tout pwoblèm posib ak kòd sous ou a, se, san egzajerasyon, yon gout nan oseyan an.

Analiz estatik se pa yon rechèch pou pinèz

Konklizyon an soti nan pi wo a: analiz estatik se pa yon mwayen pou diminye kantite domaj nan yon pwogram. Mwen ta riske di ke lè premye aplike nan pwojè ou a, li pral jwenn kote "amizan" nan kòd la, men, gen plis chans, pa pral jwenn okenn domaj ki afekte bon jan kalite a nan pwogram ou an.

Egzanp defo yo te jwenn otomatikman analizè yo enpresyonan, men nou pa ta dwe bliye ke egzanp sa yo te jwenn lè yo analize yon seri gwo kodbaz yo. Dapre prensip la menm, ti biskwit ki kapab eseye plizyè modpas senp sou yon gwo kantite kont evantyèlman jwenn kont sa yo ki gen yon modpas senp.

Èske sa vle di ke analiz estatik pa ta dwe itilize? Natirèlman pa! Ak egzakteman pou menm rezon an poukisa li vo tcheke chak nouvo modpas pou antre nan lis la sispann nan modpas "senp".

Analiz estatik se pi plis pase jwenn pinèz

An reyalite, pwoblèm yo pratikman rezoud pa analiz yo pi laj. Apre yo tout, an jeneral, analiz estatik se nenpòt chèk nan kòd sous ki te pote soti anvan yo te lanse. Men kèk bagay ou ka fè:

  • Tcheke style kodaj nan sans ki pi laj nan mo a. Sa a gen ladan tou de tcheke fòma ak chèche itilize nan parantèz vid / siplemantè, fikse papòt sou mezi tankou kantite liy / konpleksite metòd siklomatik, elatriye - tout bagay ki potansyèlman fè kòd plis lizib ak antretyen. Nan Java zouti sa a se Checkstyle, nan Python li se flake8. Anjeneral yo rele pwogram klas sa a "linters".
  • Se pa sèlman kòd ègzèkutabl ka analize. Dosye resous tankou JSON, YAML, XML, .properties ka (e yo ta dwe!) otomatikman tcheke pou validite. Èske li pa pi bon pou chèche konnen ke akòz kèk quotes ki pa pè estrikti JSON la kase nan yon etap bonè nan validasyon otomatik Pull Request pase lè egzekite tès yo oswa nan tan Run? Zouti apwopriye ki disponib: pa egzanp, YAMLint, JSONLint.
  • Konpilasyon (oswa parsing pou lang pwogramasyon dinamik) se tou yon kalite analiz estatik. Kòm yon règ, konpilateur yo kapab bay avètisman ki endike pwoblèm ak bon jan kalite a nan kòd sous la, epi yo pa ta dwe inyore.
  • Pafwa konpilasyon se pa sèlman sou konpile kòd ègzèkutabl. Pou egzanp, si ou gen dokiman nan fòma a Ascii Doktè, Lè sa a, nan moman sa a nan transfòmasyon li nan HTML/PDF handler AsciiDoctor (Plugin Maven) ka bay avètisman, pou egzanp, sou lyen entèn kase. Epi sa a se yon bon rezon pou pa aksepte Pull Request la ak chanjman dokiman yo.
  • Verifikasyon òtograf tou se yon kalite analiz estatik. Itilite aspell se kapab tcheke òtograf pa sèlman nan dokiman, men tou nan kòd sous pwogram (kòmantè ak literal) nan diferan lang pwogramasyon, ki gen ladan C/C++, Java ak Python. Yon erè òtograf nan koòdone itilizatè a oswa dokiman se tou yon defo!
  • Tès konfigirasyon (pou sa li ye, gade sa a и sa a rapò), byenke yo egzekite nan yon tès inite egzekite tankou pytest, yo aktyèlman tou yon kalite analiz estatik, paske yo pa egzekite kòd sous pandan ekzekisyon yo.

Kòm ou ka wè, jwenn pinèz nan lis sa a pran wòl ki pi piti a, ak tout lòt bagay ki disponib atravè itilizasyon zouti gratis sous louvri.

Kiyès nan kalite analiz estatik sa yo ta dwe itilize nan pwojè ou a? Natirèlman, plis, pi bon an! Bagay pwensipal lan se aplike li kòrèkteman, ki pral diskite pi lwen.

Tiyo livrezon kòm yon filtè milti-etap ak analiz estatik kòm premye kaskad li yo

Metafò klasik la pou entegrasyon kontinyèl se tiyo (tiyo) nan ki koule chanjman - soti nan chanje kòd sous la livrezon nan pwodiksyon an. Sekans estanda etap tiyo sa a sanble tankou sa a:

  1. analiz estatik
  2. konpilasyon
  3. tès inite yo
  4. tès entegrasyon
  5. Tès UI
  6. tcheke manyèl

Chanjman ki rejte nan etap Nyèm tiyo a pa pwopaje nan etap N+1.

Poukisa egzakteman fason sa a epi yo pa otreman? Nan pati tès la nan tiyo a, tèsteur yo pral rekonèt piramid tès la byen koni.

Aplike analiz estatik nan pwosesis la, olye ke chèche pinèz ak li
tès piramid. Sous: atik Martin Fowler.

Nan pati anba a nan piramid sa a gen tès ki pi fasil pou ekri, kouri pi vit, epi yo pa gen tandans bay fo pozitif. Se poutèt sa, ta dwe gen plis nan yo, yo ta dwe kouvri plis kòd epi yo dwe egzekite an premye. Nan tèt piramid la, opoze a se vre, kidonk kantite tès entegrasyon ak UI yo ta dwe redwi a minimòm ki nesesè. Moun ki nan chèn sa a se resous ki pi chè, pi dousman ak pi enfidèl, kidonk li se nan fen a epi li fè travay sèlman si etap anvan yo pa t 'jwenn okenn domaj. Sepandan, dapre menm prensip yo, tiyo a bati nan pati ki pa dirèkteman gen rapò ak tès!

Mwen ta renmen ofri yon analoji nan fòm lan nan yon sistèm filtraj dlo milti-etap. Dlo sal apwovizyone nan opinyon an (chanjman ak domaj), nan pwodiksyon an nou dwe jwenn dlo pwòp, nan ki tout kontaminan vle elimine.

Aplike analiz estatik nan pwosesis la, olye ke chèche pinèz ak li
Filtè plizyè etap. Sous: Wikimedia Commons

Kòm ou konnen, filtè netwayaj yo fèt nan yon fason ke chak pwochen kaskad ka filtre soti yon fraksyon ki pi piti nan kontaminan. An menm tan an, kaskad pirifikasyon ki pi koryas yo gen yon debi ki pi wo ak pi ba pri. Nan analoji nou an, sa vle di ke pòtay yo bon jan kalite opinyon yo pi vit, mande pou mwens efò yo kòmanse, epi yo tèt yo plis modestes nan operasyon - e sa a se egzakteman sekans yo bati nan. Wòl nan analiz estatik, ki, jan nou konprann kounye a, se kapab nan sarkle soti sèlman domaj yo ki pi brit, se wòl nan yon griyaj-"labou" nan kòmansman an anpil nan kaskad la filtre.

Analiz estatik pou kont li pa amelyore kalite pwodwi final la, menm jan yon "pèlen labou" pa fè dlo potab. Men, an komen ak lòt eleman nan CONVEYOR la, enpòtans li se evidan. Malgre ke nan yon filtè milti-etap, etap pwodiksyon yo potansyèlman kapab kaptire tout bagay menm jan ak etap yo opinyon, li klè ki konsekans yon tantativ jwenn ak sèlman etap pirifikasyon amann, san etap etap, ap mennen nan.

Objektif "pèseptè labou a" se dechaje kaskad ki vin apre yo soti nan kaptire domaj trè brit. Pou egzanp, yon minimòm, yon evalyatè kòd pa ta dwe distrè pa kòd fòma mal ak vyolasyon nòm kodaj etabli (tankou parantèz siplemantè oswa branch twò pwofondman nich). Ensèk tankou NPE ta dwe kenbe nan tès inite yo, men si menm anvan tès la analizè a endike nou ke pinèz la dwe inevitableman rive, sa a pral siyifikativman akselere fikse li yo.

Mwen panse ke li klè kounye a poukisa analiz estatik pa amelyore kalite yon pwodwi si li itilize detanzantan, epi yo ta dwe itilize toujou ap filtre soti chanjman ki gen domaj brit. Mande si w ap itilize yon analizè estatik ap amelyore kalite pwodwi ou a se apeprè ekivalan a mande "Èske bon jan kalite dlo pou bwè nan yon letan sal amelyore si yo pase l nan yon passoire?"

Aplikasyon nan yon pwojè eritaj

Yon kesyon pratik enpòtan: ki jan yo prezante analiz estatik nan pwosesis la nan entegrasyon kontinyèl kòm yon "pòtay bon jan kalite"? Nan ka tès otomatik yo, tout bagay se evidan: gen yon seri tès, echèk nenpòt nan yo se yon rezon ase yo kwè ke asanble a pa t 'pase pòtay bon jan kalite a. Yon tantativ enstale yon pòtay nan menm fason an ki baze sou rezilta yo nan analiz estatik echwe: gen twòp avètisman analiz nan kòd la eritaj, ou pa vle konplètman inyore yo, men li la tou enposib sispann livrezon an nan yon. pwodwi jis paske li gen avètisman analizeur.

Lè yo itilize pou premye fwa, analizè a jenere yon gwo kantite avètisman sou nenpòt pwojè, a vas majorite nan yo ki pa gen rapò ak fonksyone kòrèk la nan pwodwi a. Li enposib pou korije tout kòmantè sa yo nan yon fwa, e anpil nan yo pa nesesè. Apre yo tout, nou konnen ke pwodwi nou an jeneralman travay menm anvan entwodiksyon analiz estatik!

Kòm yon rezilta, anpil moun limite tèt yo a epizod itilize analiz estatik, oswa itilize li sèlman nan enfòme mòd, lè rapò analizè a tou senpleman bay pandan asanble. Sa a ekivalan a absans nenpòt analiz, paske si nou deja gen anpil avètisman, Lè sa a, ensidan an nan yon lòt (kèlkeswa jan grav) lè kòd la chanje ale inapèsi.

Fason sa yo pou entwodwi bon jan kalite pòtay yo konnen:

  • Tabli yon limit sou kantite total avètisman, oswa kantite avètisman divize pa kantite liy kòd. Sa a pa travay byen, paske tankou yon pòtay lib sote chanjman ak nouvo domaj jiskaske limit yo depase.
  • Fikse, nan kèk pwen, tout avètisman fin vye granmoun nan kòd la kòm yo te inyore, ak echèk bati a lè nouvo avètisman rive. PVS-studio bay fonksyon sa a ak kèk resous sou entènèt, tankou Codacy. Mwen pa t 'gen yon chans travay nan PVS-studio, kòm pou eksperyans mwen ak Codacy, pwoblèm prensipal yo se ke definisyon an nan sa ki se yon "ansyen" ak sa ki se yon "nouvo" erè se yon algorithm olye konplike ki pa fè sa. toujou travay kòrèkteman, sitou si dosye yo chanje anpil oswa chanje non yo. Nan memwa mwen, Codacy te kapab sote nouvo avètisman nan yon demann rale, epi an menm tan pa sote yon demann rale akòz avètisman ki pa t gen rapò ak chanjman nan kòd PR sa a.
  • Dapre mwen, solisyon ki pi efikas yo dekri nan liv la Kontini Kontini metòd "ratcheting". Lide prensipal la se ke yon pwopriyete nan chak lage se kantite avètisman analiz estatik, epi sèlman chanjman ki pa ogmante kantite total avètisman yo gen dwa.

Ratchet

Li travay tankou sa a:

  1. Nan etap inisyal la, yon dosye nan metadata lage yo sou kantite avètisman nan kòd la te jwenn nan analizè yo aplike. Kidonk, lè ou bati en, manadjè depo ou a ekri pa sèlman "lage 7.0.2", men "release 7.0.2 ki gen 100500 avètisman Checkstyle". Si w ap itilize yon manadjè depo avanse (tankou Artifactory), li fasil pou konsève metadata sa yo sou liberasyon w la.
  2. Koulye a, chak demann rale sou bati konpare kantite avètisman li resevwa ak nimewo a nan lage aktyèl la. Si PR mennen nan yon ogmantasyon nan nimewo sa a, Lè sa a, kòd la pa pase pòtay bon jan kalite a nan analiz estatik. Si kantite avètisman diminye oswa pa chanje, Lè sa a, li pase.
  3. Nan pwochen lage a, yo pral ekri kantite avètisman yo rekalkile nan metadata lage yo.

Se konsa, piti pa piti, men piti piti (tankou ak yon ratchet), kantite avètisman yo pral gen tandans a zewo. Natirèlman, sistèm nan ka twonpe lè yo prezante yon nouvo avètisman, men korije yon lòt moun. Sa a se nòmal, paske nan kouri nan longè li bay rezilta a: avètisman yo fiks, kòm yon règ, pa youn pa youn, men imedyatman pa yon gwoup nan yon sèten kalite, ak tout avètisman fasil elimine yo byen vit elimine.

Grafik sa a montre kantite total avètisman Checkstyle pou sis mwa operasyon yon "ratchet" konsa youn nan pwojè sous louvri nou yo. Nimewo a nan avètisman te diminye pa yon lòd nan grandè, e sa te rive natirèlman, an paralèl ak devlopman nan pwodwi a!

Aplike analiz estatik nan pwosesis la, olye ke chèche pinèz ak li

Mwen sèvi ak yon vèsyon modifye metòd sa a, separe avètisman konte pa modil pwojè ak zouti analiz, sa ki lakòz yon dosye YAML ak metadata asanble ki sanble yon bagay tankou sa a:

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

Nan nenpòt sistèm CI avanse, yon ratchet ka aplike pou nenpòt zouti analiz estatik san yo pa konte sou grefon ak zouti twazyèm pati. Chak nan analizè yo pwodui rapò li yo nan yon tèks senp oswa fòma XML ki fasil pou analize. Li rete pou anrejistre sèlman lojik ki nesesè nan script CI a. Ou ka wè ki jan sa a aplike nan pwojè sous louvri nou yo ki baze sou Jenkins ak Artifactory, ou kapab isit la oswa isit la. Tou de egzanp yo depann de bibliyotèk ratchetlib: metòd countWarnings() konte etikèt xml nan dosye ki te pwodwi pa Checkstyle ak Spotbugs nan fason nòmal la, ak compareWarningMaps() aplike ratchet la menm, voye yon erè lè kantite avètisman nan nenpòt nan kategori yo leve.

Yon aplikasyon ratchet enteresan posib pou analiz òtograf kòmantè, literal tèks, ak dokiman ki itilize aspell. Kòm ou konnen, lè w tcheke òtograf, se pa tout mo ki pa konnen nan diksyonè estanda a pa kòrèk, yo ka ajoute yo nan diksyonè itilizatè a. Si ou fè diksyonè itilizatè a yon pati nan kòd sous pwojè a, Lè sa a, pòtay bon jan kalite òtograf la ka formul jan sa a: ekzekisyon aspell ak diksyonè estanda a ak itilizatè. pa ta dwe pa jwenn okenn erè òtograf.

Konsènan enpòtans ki genyen nan repare vèsyon an analizeur

An konklizyon, sa ki annapre yo ta dwe remake: kèlkeswa jan ou aplike analiz la nan tiyo livrezon ou a, vèsyon an nan analizè a dwe fiks. Si ou pèmèt analizè a mete ajou espontaneman, Lè sa a, lè w ap bati pwochen demann rale a, nouvo domaj yo ka "pare" ki pa gen rapò ak chanjman kòd, men ki gen rapò ak lefèt ke nouvo analizè a tou senpleman kapab jwenn plis domaj - ak sa a pral kraze pwosesis la nan aksepte demann rale. Amelyore analizè a ta dwe yon aksyon konsyan. Sepandan, difisil fikse vèsyon an nan chak eleman asanble se yon kondisyon ki nesesè an jeneral ak yon sijè pou yon diskisyon separe.

Jwenn

  • Analiz estatik pa pral jwenn pinèz pou ou epi yo pa pral amelyore kalite pwodwi ou kòm yon rezilta nan yon aplikasyon sèl. Sèl efè pozitif sou bon jan kalite a se itilizasyon kontinyèl li pandan pwosesis livrezon an.
  • Jwenn pinèz se pa travay prensipal analiz la ditou, vas majorite de fonksyon itil yo disponib nan zouti opensource.
  • Aplike pòtay bon jan kalite ki baze sou rezilta yo nan analiz estatik nan premye etap nan tiyo livrezon an, lè l sèvi avèk yon ratchet pou kòd eritaj.

Referans

  1. Kontini Kontini
  2. A. Kudryavtsev: Analiz pwogram: ki jan yo konprann ke ou se yon pwogramè bon rapò sou diferan metòd analiz kòd (pa sèlman estatik!)

Sous: www.habr.com

Add nouvo kòmantè