Implimenta analiżi statika fil-proċess, aktar milli tużaha biex issib bugs

Ġ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 PVS-studio blog, 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 Appoġġ Java, u, ovvjament, l-iżviluppaturi ta 'IntelliJ IDEA, li l-analizzatur inkorporat tiegħu huwa probabbilment l-aktar avvanzat għal Java llum, ma setgħetx tissospendi l bogħod.

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 .

Implimenta analiżi statika fil-proċess, aktar milli tużaha biex issib bugs
Ratchet (sors: wikipedia).

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 problema ta' għeluq: 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 Teorema tar-ross, 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ż. YAMLint, JSONLint.
  • 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 AsciiDoctor, imbagħad fil-mument li tinbidel f'HTML/PDF il-handler AsciiDoctor (Plugin Maven) 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à aspell 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. dan и dan 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:

  1. analiżi statika
  2. kumpilazzjoni
  3. testijiet tal-unità
  4. testijiet ta' integrazzjoni
  5. Testijiet UI
  6. 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.

Implimenta analiżi statika fil-proċess, aktar milli tużaha biex issib bugs
Test piramida. Sors: artikolu 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.

Implimenta analiżi statika fil-proċess, aktar milli tużaha biex issib bugs
Filtru f'diversi stadji. Sors: Wikimedia Commons

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 Kunsinna Kontinwa “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:

  1. 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.
  2. 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.
  3. 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 wieħed mill-proġetti tagħna OpenSource. In-numru ta 'twissijiet naqas b'ordni ta' kobor, u dan ġara b'mod naturali, b'mod parallel mal-iżvilupp tal-prodott!

Implimenta analiżi statika fil-proċess, aktar milli tużaha biex issib bugs

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 hawn jew hawn. Iż-żewġ eżempji jiddependu fuq il-librerija ratchetlib: 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 m'għandux 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

  1. Kunsinna Kontinwa
  2. A. Kudryavtsev: Analiżi tal-programm: kif tifhem li inti programmatur tajjeb rapport dwar metodi differenti ta 'analiżi tal-kodiċi (mhux biss statiku!)

Sors: www.habr.com

Ixtri hosting affidabbli għal siti bi protezzjoni DDoS, servers VPS VDS 🔥 Ixtri hosting ta' websajts affidabbli bi protezzjoni DDoS, servers VPS VDS | ProHoster