{"id":32848,"date":"2019-10-31T21:49:16","date_gmt":"2019-10-31T18:49:16","guid":{"rendered":"https:\/\/prohoster.info\/blog\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi\/"},"modified":"2019-10-31T21:49:16","modified_gmt":"2019-10-31T18:49:16","slug":"vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","title":{"rendered":"Rakendage staatiline anal\u00fc\u00fcs protsessi, mitte \u00e4rge otsige selle abil vigu","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Seda artikkel kirjutama on mind inspireerinud suur hulk materjale staatilisest anal\u00fc\u00fcsist, mis j\u00e4rjest enam silma hakkavad. Esiteks, see on <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/\">PVS-studio blogi<\/a><\/noindex>, mis reklaamib end aktiivselt Habr's vigade \u00fclevaadete kaudu, mille nende t\u00f6\u00f6riist on leidnud avatud l\u00e4htekoodiga projektidest. Hiljuti rakendas PVS-studio <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/436496\/\">Java toe<\/a><\/noindex>, ja loomulikult ei saanud IntelliJ IDEA arendajad, kelle sisseehitatud anal\u00fcsaator on ilmselt k\u00f5ige arenenum Java jaoks, j\u00e4\u00e4da k\u00f5rvale <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/JetBrains\/blog\/436278\/\">Kui selliseid \u00fclevaateid lugeda, tekib tunne, et tegemist on maagilise eliksiiriga: vajutad nuppu ja voil\u00e0 \u2014 defektide nimekiri on silme ees. Tundub, et anal\u00fcsaatorite t\u00e4iustamisega hakkavad vead automaatselt \u00fcha rohkem esinema, ja tooted, mida need robotid skaneerivad, muutuvad \u00fcha paremaks, meie enda poolsete pingutusteta.<\/a><\/noindex>. <\/p>\n<p>Kuid maagilisi eliksiire ei ole. Soovin r\u00e4\u00e4kida asjadest, millest tavaliselt ei r\u00e4\u00e4gita postitustes \u201emida meie robot suudab leida\u201d: mida anal\u00fcsaatorid kunagi ei saa, milline on nende t\u00f5eline roll ja koht tarkvara tarnimise protsessis ning kuidas neid \u00f5igesti kasutada.<\/p>\n<p>Ratta hambad (allikas:<\/p>\n<p><img decoding=\"async\" alt=\"Rakendage staatiline anal\u00fc\u00fcs protsessi, mitte \u00e4rge otsige selle abil vigu\" src=\"\/wp-content\/uploads\/2019\/05\/2a0339f10edcaed3310676ab6e2f975a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>vikipeedia <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A5%D1%80%D0%B0%D0%BF%D0%BE%D0%B2%D0%BE%D0%B9_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC#\/media\/File:Sperrklinke_Schema.svg\">)<\/a><\/noindex>).<\/i><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Mida staatilised anal\u00fcsaatorid kunagi ei suuda<\/h2>\n<p>\nMis on, praktilisest vaatepunktist, l\u00e4htekoodi anal\u00fc\u00fcs? Me anname sisse m\u00f5ningad l\u00e4htekoodid ja saame v\u00e4ljundina l\u00fchikese aja jooksul (kui palju kiiremini kui testide l\u00e4bimine) teavet meie s\u00fcsteemi kohta. P\u00f5him\u00f5tteline ja matemaatiliselt \u00fcletamatu piirang seisneb selles, et saame sel viisil teada ainult \u00fcsna kitsast teabe klassist.<\/p>\n<p>K\u00f5ige tuntum n\u00e4ide probleemist, mida ei saa lahendada staatilise anal\u00fc\u00fcsi abil \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Halting_problem\">peatumise probleem<\/a><\/noindex>: see on teoreem, mis t\u00f5estab, et ei ole v\u00f5imalik v\u00e4lja t\u00f6\u00f6tada \u00fcldist algoritmi, mis saaks l\u00e4htekodi p\u00f5hjal m\u00e4\u00e4rata, kas programm j\u00e4\u00e4b ts\u00fcklisse v\u00f5i l\u00f5peb l\u00f5pliku aja jooksul. Selle teoreemi laienduseks on <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Rice%27s_theorem\">Reysi teoreem<\/a><\/noindex>, mis v\u00e4idab, et iga mitte-triviaalse arvutifunktsiooni omaduse m\u00e4\u00e4ramine, kas mingi programm arvutab sellise omadusega funktsiooni, on algoritmiliselt lahendamatu \u00fclesanne. N\u00e4iteks ei ole v\u00f5imalik kirjutada anal\u00fcsaatorit, mis igasuguse l\u00e4htekoodi p\u00f5hjal m\u00e4\u00e4raks, kas anal\u00fc\u00fcsitav programm on algoritmi rakendamine, mis arvutab, \u00fctleme, t\u00e4isarvu ruutu.<\/p>\n<p>Seega on staatiliste anal\u00fcsaatorite funktsionaalsusel \u00fcletamatud piirangud. Staatiline anal\u00fcsaator ei suuda kunagi k\u00f5igis juhtudel m\u00e4\u00e4rata selliseid asju nagu n\u00e4iteks nullviidatud erandi tekkimine keeltes, mis lubavad nullv\u00e4\u00e4rtust, v\u00f5i alati m\u00e4\u00e4rata, kas d\u00fcnaamilise t\u00fc\u00fcbistamisega keeltes tekib \u201eatribuut ei leitud\u201d. K\u00f5ik, mida k\u00f5ige arenenum staatiline anal\u00fcsaator suudab teha, on tuvastada erijuhte, mille hulk k\u00f5ikide v\u00f5imalike probleemide seas teie l\u00e4htekoodis on liialdamata tilk meres.<\/p>\n<h2>Staatiline anal\u00fc\u00fcs ei ole veade otsimine<\/h2>\n<p>\nK\u00e4imasolevast j\u00e4rjekorrast tuleneb j\u00e4reldus: staatiline anal\u00fc\u00fcs ei ole vahend defektide arvu v\u00e4hendamiseks programmis. Julgen v\u00e4ita, et kui seda esmakordselt teie projekti rakendada, leiab see koodist \u201ehuvitavaid\u201d kohti, kuid t\u00f5en\u00e4oliselt ei leia see \u00fchtegi defekti, mis m\u00f5jutaks teie programmi t\u00f6\u00f6 kvaliteeti.<\/p>\n<p>Automaatsete anal\u00fcsaatorite leidnud defektide n\u00e4ited on muljetavaldavad, kuid \u00e4rge unustage, et need n\u00e4ited on leitud suure koodibaasi skaneerimise k\u00e4igus. Samamoodi v\u00f5ivad h\u00e4kkerid, kellel on v\u00f5imalus katsetada mitmeid lihtsaid paroole paljude kontodega, viimaks leida kontosid, kus on lihtne parool.<\/p>\n<p>Kas see t\u00e4hendab, et staatilist anal\u00fc\u00fcsi ei tohiks kasutada? Loomulikult mitte! Ja just selle p\u00e4rast, miks on m\u00f5istlik kontrollida iga uut parooli \u201elihtsate\u201d paroolide mustris.<\/p>\n<h2>Staatiline anal\u00fc\u00fcs on rohkem kui veade otsimine<\/h2>\n<p>\nTegelikult on t\u00f5eliselt lahendatavad anal\u00fc\u00fcsi \u00fclesanded oluliselt laiemad. L\u00f5ppude l\u00f5puks on staatiline anal\u00fc\u00fcs igasugune l\u00e4htekoodide kontroll, mis toimub enne nende k\u00e4ivitamist. Siin on m\u00f5ned asjad, mida saab teha:<\/p>\n<ul>\n<li> Koodimise stiili kontroll laiemas m\u00f5ttes h\u00f5lmab nii vormindamise kontrollimist kui ka t\u00fchjade\/\u00fclej\u00e4\u00e4nud sulgude kasutamise leidmist, m\u00f5\u00f5dikute nagu koodiridade arvu\/cyclomatic complexity s\u00e4tteid ja piirv\u00e4\u00e4rtusi jne \u2014 k\u00f5ike, mis potentsiaalselt raskendab koodi loetavust ja hooldust. Java-s on selline t\u00f6\u00f6riist Checkstyle, Pythonis aga flake8. Selliseid programme nimetatakse sageli \"linteerijateks\".<\/li>\n<li>Anal\u00fc\u00fcsi all v\u00f5ib olla mitte ainult k\u00e4ivitatav kood. Ressursifailid, nagu JSON, YAML, XML, .properties, v\u00f5ivad (ja peavad!) olema automaatselt kontrollitud kehtivuse osas. L\u00f5ppude l\u00f5puks on parem teada, et m\u00f5ne paarita jutum\u00e4rgi t\u00f5ttu on JSON-i struktuur rikutud varajases Pull Requesti automaatkontrolli etapis, kui siis, kui testid v\u00f5i Run time seda proovivad? Vastavad t\u00f6\u00f6riistad on olemas: n\u00e4iteks <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/adrienverge\/yamllint\">YAMLlint<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zaach\/jsonlint\">JSONLint<\/a><\/noindex>.<\/li>\n<li> Kompilatsioon (v\u00f5i d\u00fcnaamiliste programmeerimiskeelte puhul parsimine) on samuti staatilise anal\u00fc\u00fcsi t\u00fc\u00fcp. Reeglina suudavad kompilaatorid anda hoiatusi, mis viitavad allika kvaliteedi probleemidele, ja neid hoiatusi ei tohiks eirata.<\/li>\n<li>M\u00f5nikord ei ole kompilatsioon ainult k\u00e4ivitatava koodi kompilatsioon. N\u00e4iteks kui sul on dokumentatsioon formaadis <noindex><a rel=\"nofollow\" href=\"https:\/\/asciidoctor.org\/\">AsciiDoctor<\/a><\/noindex>, siis selle muutmisel HTML-iks\/PDF-iks v\u00f5ib AsciiDoctor (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/asciidoctor\/asciidoctor-maven-plugin\">Maven plugin<\/a><\/noindex>) anda hoiatusi, n\u00e4iteks sisemiste linkide rikkumise kohta. Ja see on olulise p\u00f5hjus, et mitte aktsepteerida Pull Requesti dokumentatsiooni muudatustega.<\/li>\n<li>\u00d5igekirjakontroll on samuti staatilise anal\u00fc\u00fcsi t\u00fc\u00fcp. T\u00f6\u00f6riist <noindex><a rel=\"nofollow\" href=\"http:\/\/aspell.net\/\">aspell<\/a><\/noindex> suudab kontrollida \u00f5igekirja mitte ainult dokumentatsioonis, vaid ka programmikoodides (kommentaarides ja literalides) erinevates programmeerimiskeeltes, sealhulgas C\/C++, Java ja Python. \u00d5igekirja viga kasutajaliideses v\u00f5i dokumentatsioonis on samuti defekt!<\/li>\n<li>Konfiguratsioonitestid (millest r\u00e4\u00e4kida \u2014 vt. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=KaeEjsAjV6A&amp;index=30&amp;list=PLsVTVVvrKX9tuYyCtL8mASB6IOaa-kRCA&amp;t=0s\">seda<\/a><\/noindex> ja <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=Tk_nmV-mWOA\">seda<\/a><\/noindex> ettekanded), kuigi neid t\u00e4idetakse pytesti sarnastes keskkondades, on tegelikult samuti staatilise anal\u00fc\u00fcsi t\u00fc\u00fcp, kuna nad ei k\u00e4ivita allika koodi oma t\u00e4itmise k\u00e4igus.<\/li>\n<\/ul>\n<p>\nNagu n\u00e4eme, m\u00e4ngib veaparandamine selle nimekirja kontekstis k\u00f5ige v\u00e4hem t\u00e4htsat rolli, aga k\u00f5ik muu on kergesti k\u00e4ttev\u00f5tte tasuta open source t\u00f6\u00f6riistade abil kergesti k\u00e4tte saadav.<\/p>\n<p>Milliseid nendest staatilise anal\u00fc\u00fcsi t\u00fcpidest tuleks kasutada teie projektis? Loomulikult k\u00f5iki, mida rohkem - seda parem! Peamine on \u00f5igesti rakendada, millest j\u00e4rgmises osas r\u00e4\u00e4gitakse.<\/p>\n<h2>Tarneprotsess kui mitmeastmeline filter ja staatiline anal\u00fc\u00fcs kui selle esialgne kaskaad<\/h2>\n<p>\nTraditsiooniline metafoor pidevaks integreerimiseks on pipeline, mille kaudu voolavad muudatused - allika koodist toimetamiseni tootmisse. Selle pipelini tavaline etapp on j\u00e4rgmine:<\/p>\n<ol>\n<li>staatiline anal\u00fc\u00fcs<\/li>\n<li>kompilatsioon<\/li>\n<li>moodulitestid<\/li>\n<li>integreerimistestid<\/li>\n<li>UI testid<\/li>\n<li>k\u00e4tega kontrollimine<\/li>\n<\/ol>\n<p>\nMuutused, mis l\u00fckatakse tagasi N. etapil, ei l\u00e4he edasi etapile N+1.<\/p>\n<p>Miks just nii, mitte teisiti? Testimisega seotud etapis saavad testerid teada laialt tuntud testimise p\u00fcramiidist.<\/p>\n<p><img decoding=\"async\" alt=\"Rakendage staatiline anal\u00fc\u00fcs protsessi, mitte \u00e4rge otsige selle abil vigu\" src=\"\/wp-content\/uploads\/2019\/05\/f155307fd4c1663800843c394098ea6f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Testimise p\u00fcramiid. Allikas: <noindex><a rel=\"nofollow\" href=\"https:\/\/martinfowler.com\/bliki\/TestPyramid.html\">artikkel<\/a><\/noindex> Martin Fowler.<\/i><\/p>\n<p>P\u00fcramiidi alumises osas asuvad testid, mida on lihtsam kirjutada, mis t\u00e4idetakse kiiremini ja millel ei ole valeh\u00e4irete kalduvust. Seet\u00f5ttu peaks neid olema rohkem, nad peaksid katma rohkem koodi ja nad t\u00e4idetakse esimesena. P\u00fcramiidi \u00fclemises osas on vastupidi, seet\u00f5ttu tuleks integreerimis- ja UI-testide arvu v\u00e4hendada vajalikule miinimumile. Inimene selles ahelas on k\u00f5ige kallim, aeglasem ja usaldamatum ressurss, seet\u00f5ttu on ta k\u00f5ige l\u00f5pus ja t\u00e4idab t\u00f6\u00f6d ainult siis, kui eelnevad etapid ei ole mingeid defekte leidnud. Kuid sama p\u00f5him\u00f5tte j\u00e4rgi \u00fcles ehitatud ka pipeline osades, mis ei ole otseselt seotud testimisega!<\/p>\n<p>Sooviksin pakkuda analoogiat mitmeastmelise vee filtreerimisse s\u00fcsteemiga. Sissevoolu n\u00e4idatakse musta veena (defektidega muudatused), v\u00e4ljundil peame saama puhta vee, k\u00f5ik soovimatud saasteained on eemaldatud.<\/p>\n<p><img decoding=\"async\" alt=\"Rakendage staatiline anal\u00fc\u00fcs protsessi, mitte \u00e4rge otsige selle abil vigu\" src=\"\/wp-content\/uploads\/2019\/05\/76b5be8f13d55c16970d67e09767a045.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Mitmeastmeline filter. Allikas: <noindex><a rel=\"nofollow\" href=\"https:\/\/commons.wikimedia.org\/wiki\/File:Milli-Q_Water_filtration_station.JPG\">Wikimedia Commons<\/a><\/noindex><\/i><\/p>\n<p>Nagu teada, puhastavad filtrid on kujundatud nii, et iga j\u00e4rgmine kaskad suudab filtreerida \u00fcha v\u00e4iksemaid saastefraktsioone. Sellega seoses on rohus\u00f5elumise kaskadidel suurem l\u00e4bilaskev\u00f5ime ja madalam hind. Meie analoogias t\u00e4hendab see, et sisendquality gates on suurema j\u00f5udluse ja nende k\u00e4ivitamine n\u00f5uab v\u00e4hem pingutust, nad on ka enesestm\u00f5istetavad t\u00f6\u00f6shoidmiselt \u2014 ning just seda j\u00e4rjekorda nad j\u00e4rgivad. Staatilise anal\u00fc\u00fcsi roll, mis, nagu me n\u00fc\u00fcd m\u00f5istame, suudab tuvastada vaid k\u00f5ige paksemaid vigu \u2014 on v\u00f5rgusilma roll kaskadi alguses.<\/p>\n<p>Staatiline anal\u00fc\u00fcs iseenesest ei paranda l\u00f5pp-produkti kvaliteeti, nagu v\u00f5rgusilm ei muuda vett joodavaks. Siiski, koos teiste komponentidega, on selle olulisus ilmne. Kuigi mitmikfiltris on v\u00e4ljundkaskadid potentsiaalselt v\u00f5imelised p\u00fc\u00fcdma sama, mis sisendkaskadid \u2014 on selge, millistele tagaj\u00e4rgedele v\u00f5ib viia katse pideva peenetootmise kaskadega, ilma sisendkaskadideta.<\/p>\n<p>V\u00f5rgusila eesm\u00e4rk on vabastada j\u00e4rgmised kaskadid k\u00f5ige paksemete vigade p\u00fc\u00fcdmisest. N\u00e4iteks ei tohiks v\u00e4hemalt koodiarvutaja segada end valesti vormindatud koodi ja kehtestatud koodinormide rikkumisega (nagu liialdatud sulud v\u00f5i liiga s\u00fcgavad harunemised). Vead nagu NPE peaksid olema p\u00fc\u00fctud moodulitestide kaudu, kuid kui juba enne testi anal\u00fcsaator meid hoiatab, et viga on paratamatu \u2014 kiirendab see oluliselt selle parandamist.<\/p>\n<p>Ma arvan, et n\u00fc\u00fcd on selge, miks staatiline anal\u00fc\u00fcs ei paranda toote kvaliteeti, kui seda rakendatakse episoodselt, ja peab olema pidev, et k\u00f5rvaldada muudatusi, mis sisaldavad suuri vigu. K\u00fcsimus, kas staatilise anal\u00fcsaatori kasutamine parandab teie toote kvaliteeti, on umbes sama, mis k\u00fcsida: \"kas vees, mis on saadud mudasest veekogust, paranevad joodavad omadused, kui seda lasta l\u00e4bi s\u00f5ela?\"<\/p>\n<h2>Implementatsioon legacy-projekti<\/h2>\n<p>\nOluline praktiline k\u00fcsimus: kuidas juurutada staatiline anal\u00fc\u00fcs pideva integreerimise protsessis kui \"quality gate\"? Automaatsete testide puhul on k\u00f5ik selge: on katsete komplekt, mille eba\u00f5nnestumine on piisav p\u00f5hjus, et arvata, et kogumine ei l\u00e4binud quality gate'i. \u00dcritus kehtestada sama moodi gate staatilise anal\u00fc\u00fcsi tulemuste p\u00f5hjal nurjub: legacy-koodil on anal\u00fc\u00fcsi hoiatusi liiga palju, neid ei saa t\u00e4ielikult ignoreerida, kuid toote tarnimine ei saa peatuda ainult selle p\u00e4rast, et selles on anal\u00fcsaatori hoiatused.<\/p>\n<p>Esmakordselt rakendades annab anal\u00fcsaator igasuguste h\u00f5ikude hulga, millest enamik ei ole seotud toote t\u00f6\u00f6kindlusega. K\u00f5iki need m\u00e4rkusi kohe parandada ei saa, paljusid \u2014 ja ei olegi vaja. L\u00f5ppude l\u00f5puks teame, et meie toode t\u00f6\u00f6tab \u00fcldiselt ja enne staatilise anal\u00fc\u00fcsi rakendamist!<\/p>\n<p>L\u00f5puks piirdub paljud staatilise anal\u00fc\u00fcsi episoodilise kasutamisega v\u00f5i kasutavad seda ainult teavitamise re\u017eiimis, kui koostamise ajal antakse lihtsalt anal\u00fcsaatori aruande. See on v\u00f5rreldav igasuguse anal\u00fc\u00fcsi puudumisega, kuna kui meil on juba palju hoiatusi, siis uue (kui t\u00f5sise) puudumine koodi muutmisel j\u00e4\u00e4b t\u00e4helepanuta.<\/p>\n<p>On teada j\u00e4rgmised meetodid quality gates'i kehtestamiseks:<\/p>\n<ul>\n<li>\u00dcldiste hoiatusete arvu v\u00f5i hoiatusete arvu koodi ridade arvu j\u00e4rgi kehtestamine. See ei toimi h\u00e4sti, sest selline gate lubab vabalt muudatusi uute vigadega, kuni nende limiit \u00fcletatakse.<\/li>\n<li>K\u00f5ik vana hoiatused kodeerimise hetkel fikseeritakse kui ignoreeritavad, ja uute hoiatuste korral arvutada pole. Sellist funktsionaalsust pakuvad PVS-stuudio ja m\u00f5ned veebiteenused, n\u00e4iteks Codacy. Ma ei ole PVS-stuudioga t\u00f6\u00f6tanud, kuid minu kogemus Codacyga on see, et m\u00e4\u00e4ratleda, mis on \"vana\" ja mis on \"uus\" viga on \u00fcsna keeruline ja mitte alati t\u00e4pselt t\u00f6\u00f6tav algoritm, eriti kui failid muutuvad v\u00f5i nimetatakse \u00fcmber. Minu m\u00e4letamist m\u00f6\u00f6da j\u00f5udis Codacy lubama pulbrekvisitsiooni uute hoiatuste, samas kui ei lasknud pull request'i l\u00e4bi hoiatuste t\u00f5ttu, mis ei olnud seotud koodi selle PR-i muudatustega.<\/li>\n<li>Minu arvates on k\u00f5ige t\u00f5husam lahendus see, mis on kirjeldatud raamatus <noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Continuous-Delivery-Deployment-Automation-Addison-Wesley\/dp\/0321601912\">J\u00e4tkuv kohaletoimetamine<\/a><\/noindex> \u00abrattimismeetod\u00bb (\u00abratcheting\u00bb). Peamine idee seisneb selles, et iga versiooni omadus on staatilise anal\u00fc\u00fcsi hoiatuste arv ning lubatud on vaid sellised muudatused, mis ei suurenda hoiatuste koguarvu.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Rattimeetod<\/h2>\n<p>\nSee toimib j\u00e4rgmiselt:<\/p>\n<ol>\n<li>Esialgses etapis salvestatakse versiooni metainfos hoiatuste arv koodis, mille anal\u00fcsaatorid on leidnud. Nii salvestatakse peamise haru kompileerimisel teie repotejuriis mitte lihtsalt \u00abversioon 7.0.2\u00bb, vaid \u00abversioon 7.0.2, mis sisaldab 100500 Checkstyle-hoiatust\u00bb. Kui kasutate arenenud repotejuriisi (nt Artifactory), on selliste metainfode s\u00e4ilitamine teie versiooni jaoks lihtne.<\/li>\n<li>N\u00fc\u00fcd v\u00f5rdleb iga pull request kompileerimisel saadud hoiatuste arvu selle arvu kanssa, mis on praegusel versioonil. Kui PR toob kaasa selle arvu suurenemise, siis ei l\u00e4binud kood kvaliteedi v\u00e4ravat staatilise anal\u00fc\u00fcsi osas. Kui hoiatuste arv v\u00e4heneb v\u00f5i p\u00fcsib samana, siis l\u00e4bib see.<\/li>\n<li>J\u00e4rgmise versiooni puhul salvestatakse uuesti arvutatud hoiatuste arv versiooni metainfosse.<\/li>\n<\/ol>\n<p>\nNii p\u00fcsivalt, kuid kindlalt (nagu rattimeetod t\u00f6\u00f6tab) p\u00fc\u00fcab hoiatuste arv j\u00f5uda nullini. Loomulikult saab s\u00fcsteemi petta, lisades uue hoiatuse, kuid parandades kellegi teise oma. See on normaalne, kuna pikaajaliselt annab see tulemuse: hoiatuste parandamine ei k\u00e4i tavaliselt \u00fckshaaval, vaid kohe r\u00fchmades, mis on teatud t\u00fc\u00fcpi, ja k\u00f5ik lihtsalt k\u00f5rvaldatavad hoiatuste hulk k\u00f5rvaldatakse \u00fcsna kiiresti.<\/p>\n<p>Sellel graafikul on n\u00e4idatud Checkstyle-hoiatuste koguarv kuue kuu jooksul, kui selline \u00abrattimeetod\u00bb t\u00f6\u00f6tas <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\">\u00fche meie OpenSource projektide juures<\/a><\/noindex>. Hoiatusi on v\u00e4hendatud korralikult, ja see juhtus loomulikult, paralleelselt toote arendamisega!<\/p>\n<p><img decoding=\"async\" alt=\"Rakendage staatiline anal\u00fc\u00fcs protsessi, mitte \u00e4rge otsige selle abil vigu\" src=\"\/wp-content\/uploads\/2019\/05\/9529bb2fb32187057088e8d2c4203333.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKasutame muudetud versiooni sellest meetodist, arvutades hoiatuste arvu projektimoodulite ja anal\u00fc\u00fcsi t\u00f6\u00f6riistade kaupa. Sellest tulenev YAML-fail versiooni metainfode kohta n\u00e4eb v\u00e4lja umbes selline:<\/p>\n<pre><code class=\"plaintext\">celesta-sql:\n  checkstyle: 434\n  spotbugs: 45\ncelesta-core:\n  checkstyle: 206\n  spotbugs: 13\ncelesta-maven-plugin:\n  checkstyle: 19\n  spotbugs: 0\ncelesta-unit:\n  checkstyle: 0\n  spotbugs: 0\n<\/code><\/pre>\n<p>\nIgas arenenud CI-s\u00fcsteemis on \u00abrattimeetod\u00bb v\u00f5imalik rakendada iga staatilise anal\u00fc\u00fcsi t\u00f6\u00f6riista jaoks, tuginedes mitte pluginatele ja kolmandate osapoolte t\u00f6\u00f6riistadele. Iga anal\u00fcsaator annab oma aruande lihtsas tekstivormingus v\u00f5i XML formaadis, mis on h\u00f5lpsasti anal\u00fc\u00fcsitav. Alles j\u00e4\u00e4b vaid vajalik loogika CI-skriptis \u00fcles kirjutada. Kuidas seda on teostatud meie open source projektides Jenkins'i ja Artifactory baasil, saab vaadata <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/2bass\/blob\/dev\/Jenkinsfile\">siit<\/a><\/noindex> v\u00f5i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\/blob\/dev\/Jenkinsfile\">siit<\/a><\/noindex>. M\u00f5lemad n\u00e4ited s\u00f5ltuvad raamatukogust <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/inponomarev\/ratchetlib\">ratchetlib<\/a><\/noindex>: meetod <code>countWarnings()<\/code> loendab tavaliselt xml-m\u00e4rgiseid failides, mille on loonud Checkstyle ja Spotbugs, ja <code>compareWarningMaps()<\/code> rakendab seda rattimeetodit, andes vea, kui hoiatuste arv m\u00f5nes kategoorias t\u00f5useb.<\/p>\n<p>Huvitav variatsioon \u00abrattimeetodi\u00bb rakendamiseks on kommentaaride, tekstiliste literatuuride ja dokumentatsiooni \u00f5igekirja anal\u00fc\u00fcsimiseks aspelli abil. Nagu teada, ei ole k\u00f5ik teadmata s\u00f5nad, mis ei ole standardsetes s\u00f5nastikes, vale, nad v\u00f5ivad olla lisatud kasutaja s\u00f5nastikku. Kui teha kasutaja s\u00f5nastik projekti l\u00e4htekoodi osaks, v\u00f5ib \u00f5igekirja kvaliteedi v\u00e4rav olla formuleeritud j\u00e4rgmiselt: aspelli k\u00e4ivitamine standardse ja kasutaja s\u00f5nastikuga <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\/blob\/271dcfc8dc3ad65ac2d1dcaa39b7fd3ea8fb5891\/Jenkinsfile#L36\">ei tohi<\/a><\/noindex> leida mingeid \u00f5igekirjavigu.<\/p>\n<h2>Anal\u00fcsaatori versiooni fikseerimise t\u00e4htsus<\/h2>\n<p>\nKokkuv\u00f5tteks on oluline mainida j\u00e4rgmist: kuidas iganes te anal\u00fc\u00fcsi oma tarnimisprotsessi rakendate, peab anal\u00fcsaatori versioon olema fikseeritud. Kui lubate anal\u00fcsaatori spontaanse uuendamise, v\u00f5ivad j\u00e4rgmise pull requesti koostamisel ilmuda uued defektid, mis ei ole seotud koodimuudatustega, vaid sellega, et uus anal\u00fcsaator suudab lihtsalt leida rohkem defekte - ja see rikub teie pull requestide aktsepteerimise protsessi. Anal\u00fcsaatori uuendamine peab olema teadlik tegevus. Siiski, iga koostisosade versiooni range fikseerimine on \u00fcldiselt vajalik n\u00f5ue ja eraldi teema.<\/p>\n<h2>J\u00e4reldused<\/h2>\n<p><\/p>\n<ul>\n<li>Staatiline anal\u00fc\u00fcs ei leia teile vigu ega paranda teie toote kvaliteeti \u00fcheainsa rakendusega. Positiivne efekt kvaliteedis tuleb ainult siis, kui seda rakendatakse pidevalt tarnimisprotsessi k\u00e4igus.<\/li>\n<li>Vigade otsimine ei ole anal\u00fc\u00fcsi peamine \u00fclesanne, enamik kasulikest funktsioonidest on saadaval avatud l\u00e4htekoodiga t\u00f6\u00f6riistades.<\/li>\n<li>Rakendage kvaliteedi kontrolle staatilise anal\u00fc\u00fcsi tulemustel, kasutades 'ratast' p\u00e4randkoodi puhul tarnimise konveieril juba algfaasis.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Lingid<\/h2>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Continuous-Delivery-Deployment-Automation-Addison-Wesley\/dp\/0321601912\">J\u00e4tkuv kohaletoimetamine<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=8Cx3LHNjI24\">A. Kudrjavtsev: Programmide anal\u00fc\u00fcs: kuidas m\u00f5ista, et oled hea programmeerija<\/a><\/noindex> ettekanne erinevatest koodi anal\u00fc\u00fcsi meetoditest (mitte ainult staatilisest!)<\/li>\n<\/ol>\n<p>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/436868\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u0435\u043d\u044f \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u0431\u043b\u043e\u0433 PVS-studio, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0441\u0435\u0431\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u0431\u0437\u043e\u0440\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u041d\u0435\u0434\u0430\u0432\u043d\u043e PVS-studio \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Java, \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 IntelliJ IDEA, \u0447\u0435\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24622,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32848","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u0435\u043d\u044f \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u0431\u043b\u043e\u0433 PVS-studio, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0441\u0435\u0431\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u0431\u0437\u043e\u0440\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u041d\u0435\u0434\u0430\u0432\u043d\u043e PVS-studio \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Java, \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 IntelliJ IDEA, \u0447\u0435\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435,\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0412\u043d\u0435\u0434\u0440\u044f\u0439\u0442\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0430 \u043d\u0435 \u0438\u0449\u0438\u0442\u0435 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0430\u0433\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u0435\u043d\u044f \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u0431\u043b\u043e\u0433 PVS-studio, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0441\u0435\u0431\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u0431\u0437\u043e\u0440\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u041d\u0435\u0434\u0430\u0432\u043d\u043e PVS-studio \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Java, \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 IntelliJ IDEA, \u0447\u0435\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:49:16+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:49:16+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Rakendage staatilist anal\u00fc\u00fcsi protsessis, mitte \u00e4rge otsige selle abil vigu | ProHoster","description":"Selle artikli kirjutamiseks innustas mind suur hulk materjale staatilisest anal\u00fc\u00fcsist, mis \u00fcha sagedamini silme ette sattus. Esiteks on see PVS-studio blogi, mis tutvustab end aktiivselt Habras vigade \u00fclevaatuste kaudu, mida nende t\u00f6\u00f6riist on avatud koodiga projektides leidnud. Hiljuti on PVS-studio toetanud Java, ja loomulikult on IntelliJ IDEA arendajad, kelle sisseehitatud anal\u00fcsaator on t\u00e4na t\u00f5en\u00e4oliselt parim.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0412\u043d\u0435\u0434\u0440\u044f\u0439\u0442\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0430 \u043d\u0435 \u0438\u0449\u0438\u0442\u0435 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0430\u0433\u0438 | ProHoster","og:description":"\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u0435\u043d\u044f \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u0431\u043b\u043e\u0433 PVS-studio, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0441\u0435\u0431\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u0431\u0437\u043e\u0440\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u041d\u0435\u0434\u0430\u0432\u043d\u043e PVS-studio \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Java, \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 IntelliJ IDEA, \u0447\u0435\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435,","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:49:16+00:00","article:modified_time":"2019-10-31T18:49:16+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32848","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 12:50:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:51:27","updated":"2026-01-21 12:50:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/32848","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=32848"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/32848\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/24622"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=32848"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=32848"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=32848"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}