{"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\/sk\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","title":{"rendered":"Implementujte statick\u00fa anal\u00fdzu do procesu, namiesto toho, aby ste h\u013eadali chyby pomocou nej","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Nap\u00edsa\u0165 tento \u010dl\u00e1nok ma podnietilo mno\u017estvo materi\u00e1lov o statickej anal\u00fdze, ktor\u00e9 sa \u010doraz \u010dastej\u0161ie dost\u00e1vali do o\u010d\u00ed. Po prv\u00e9, je to <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/\">blog PVS-studio<\/a><\/noindex>, ktor\u00fd sa akt\u00edvne propaguje na Habr pri pomoci preh\u013eadov ch\u00fdb, ktor\u00e9 na\u0161iel ich n\u00e1stroj v projektoch s otvoren\u00fdm k\u00f3dom. Ned\u00e1vno PVS-studio implementovali <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/436496\/\">podporu Javy<\/a><\/noindex>, a samozrejme, v\u00fdvoj\u00e1ri IntelliJ IDEA, ktor\u00e9ho vstavan\u00fd analyz\u00e1tor je dnes pravdepodobne najpokro\u010dilej\u0161\u00ed pre Javu, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/JetBrains\/blog\/436278\/\">nemohli zosta\u0165 bokom<\/a><\/noindex>. <\/p>\n<p>Pri \u010d\u00edtan\u00ed tak\u00fdch preh\u013eadov vznik\u00e1 pocit, \u017ee hovor\u00edme o magickom elix\u00edre: stla\u010dte tla\u010didlo a tu je \u2014 zoznam defektov pred o\u010dami. Zd\u00e1 sa, \u017ee s pokrokom analyz\u00e1torov sa \u010doraz viac ch\u00fdb automaticky n\u00e1jde a produkty skenovan\u00e9 t\u00fdmito robotmi sa stan\u00fa \u010doraz lep\u0161\u00edmi, bez ak\u00fdchko\u013evek sn\u00e1h z na\u0161ej strany.<\/p>\n<p>Ale magick\u00e9 elix\u00edry neexistuj\u00fa. Chcel by som hovori\u0165 o tom, o \u010dom sa zvy\u010dajne nehovor\u00ed v pr\u00edspevkoch ako \u201etoto s\u00fa veci, ktor\u00e9 m\u00f4\u017ee n\u00e1\u0161 robot n\u00e1js\u0165\u201c: \u010do analyz\u00e1tory nikdy nem\u00f4\u017eu, ak\u00e1 je ich skuto\u010dn\u00e1 \u00faloha a miesto v procese dod\u00e1vky softv\u00e9ru a ako ich spr\u00e1vne implementova\u0165.<\/p>\n<p><img decoding=\"async\" alt=\"Implementujte statick\u00fa anal\u00fdzu do procesu, namiesto toho, aby ste h\u013eadali chyby pomocou nej\" src=\"\/wp-content\/uploads\/2019\/05\/2a0339f10edcaed3310676ab6e2f975a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Hr\u00e1\u010dek (zdroj: <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\">wikipedia<\/a><\/noindex>).<\/i><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>\u010co statick\u00e9 analyz\u00e1tory nikdy nebud\u00fa schopn\u00e9<\/h2>\n<p>\n\u010co je, z praktick\u00e9ho h\u013eadiska, anal\u00fdza zdrojov\u00e9ho k\u00f3du? Predklad\u00e1me niektor\u00e9 zdrojov\u00e9 k\u00f3dy a na v\u00fdstupe za kr\u00e1tky \u010das (ove\u013ea krat\u0161\u00ed \u010das ako pri sp\u00fa\u0161\u0165an\u00ed testov) z\u00edskavame ur\u010dit\u00e9 inform\u00e1cie o na\u0161om syst\u00e9me. Z\u00e1sadn\u00e9 a matematicky prekonate\u013en\u00e9 obmedzenie spo\u010d\u00edva v tom, \u017ee m\u00f4\u017eeme t\u00fdmto sp\u00f4sobom z\u00edska\u0165 len pomerne \u00fazky rozsah inform\u00e1ci\u00ed.<\/p>\n<p>Najzn\u00e1mej\u0161\u00edm pr\u00edkladom \u00falohy, ktor\u00e1 sa ned\u00e1 vyrie\u0161i\u0165 pomocou statickej anal\u00fdzy \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Halting_problem\">probl\u00e9m zastavenia<\/a><\/noindex>: je to veta, ktor\u00e1 dokazuje, \u017ee nemo\u017eno vyvin\u00fa\u0165 v\u0161eobecn\u00fd algoritmus, ktor\u00fd by na z\u00e1klade zdrojov\u00e9ho k\u00f3du programu ur\u010dil, \u010di sa dostane do nekone\u010dnej slu\u010dky alebo ukon\u010d\u00ed za kone\u010dn\u00fd \u010das. Roz\u0161\u00edren\u00edm tejto vety je <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Rice%27s_theorem\">Riceova veta<\/a><\/noindex>, ktor\u00e1 tvrd\u00ed, \u017ee pre ak\u00e9ko\u013evek netrivi\u00e1lne vlastnosti v\u00fdpo\u010dtov\u00fdch funkci\u00ed je defin\u00edcia toho, \u010di n\u00e1hodn\u00fd program po\u010d\u00edta funkciu s takou vlastnos\u0165ou, algoritmicky neodborn\u00e1 \u00faloha. Napr\u00edklad, nie je mo\u017en\u00e9 nap\u00edsa\u0165 analyz\u00e1tor, ktor\u00fd na z\u00e1klade ak\u00e9hoko\u013evek zdrojov\u00e9ho k\u00f3du ur\u010d\u00ed, \u010di analyzovan\u00fd program implementuje algoritmus, ktor\u00fd po\u010d\u00edta, povedzme, umocnenie cel\u00e9ho \u010d\u00edsla na druh\u00fa.<\/p>\n<p>Tak\u017ee funk\u010dnos\u0165 statick\u00fdch analyz\u00e1torov m\u00e1 neprekonate\u013en\u00e9 obmedzenia. Statick\u00fd analyz\u00e1tor nikdy nebude schopn\u00fd vo v\u0161etk\u00fdch pr\u00edpadoch ur\u010di\u0165 tak\u00e9 veci, ako je napr\u00edklad vznik 'null pointer exception' v jazykoch, ktor\u00e9 umo\u017e\u0148uj\u00fa hodnotu null, alebo vo v\u0161etk\u00fdch pr\u00edpadoch ur\u010di\u0165 vznik 'attribute not found' v jazykoch s dynamick\u00fdm typovan\u00edm. V\u0161etko, \u010do m\u00f4\u017ee najdokonalej\u0161\u00ed statick\u00fd analyz\u00e1tor, je vybra\u0165 \u0161pecifick\u00e9 pr\u00edpady, ktor\u00fdch po\u010det medzi v\u0161etk\u00fdmi mo\u017en\u00fdmi probl\u00e9mami vo va\u0161om zdrojovom k\u00f3de je, bez preh\u00e1\u0148ania, kvapkou v mori.<\/p>\n<h2>Statick\u00e1 anal\u00fdza nie je h\u013eadanie ch\u00fdb.<\/h2>\n<p>\nZ vy\u0161\u0161ie uveden\u00e9ho mo\u017eno vyvodi\u0165 z\u00e1ver: statick\u00e1 anal\u00fdza nie je n\u00e1stroj na zn\u00ed\u017eenie po\u010dtu defektov v programe. Riskol by som poveda\u0165: ke\u010f sa po prv\u00fd raz pou\u017eije vo va\u0161om projekte, n\u00e1jde v k\u00f3de 'zauj\u00edmav\u00e9' miesta, ale pravdepodobne nen\u00e1jde \u017eiadne defekty, ktor\u00e9 by ovplyvnili kvalitu pr\u00e1ce va\u0161ej aplik\u00e1cie.<\/p>\n<p>Pr\u00edklady defektov automaticky n\u00e1jden\u00fdch analyz\u00e1tormi s\u00fa impozantn\u00e9, ale netreba zab\u00fada\u0165, \u017ee tieto pr\u00edklady boli n\u00e1jden\u00e9 pomocou skenovania ve\u013ek\u00e9ho s\u00faboru ve\u013ek\u00fdch k\u00f3dov\u00fdch z\u00e1kladn\u00ed. Na rovnakom princ\u00edpe, hackers, ktor\u00ed maj\u00fa mo\u017enos\u0165 vysk\u00fa\u0161a\u0165 nieko\u013eko jednoduch\u00fdch hesiel na ve\u013ekom po\u010dte \u00fa\u010dtov, nakoniec n\u00e1jdu tie \u00fa\u010dty, ktor\u00e9 maj\u00fa jednoduch\u00e9 heslo.<\/p>\n<p>Znamen\u00e1 to, \u017ee statick\u00fa anal\u00fdzu netreba aplikova\u0165? Samozrejme, \u017ee nie! A to z rovnak\u00e9ho d\u00f4vodu, pre ktor\u00fd je dobr\u00e9 kontrolova\u0165 ka\u017ed\u00e9 nov\u00e9 heslo, aby nebolo na zozname 'jednoduch\u00fdch' hesiel.<\/p>\n<h2>Statick\u00e1 anal\u00fdza je viac ne\u017e h\u013eadanie ch\u00fdb.<\/h2>\n<p>\nV skuto\u010dnosti s\u00fa \u00falohy, ktor\u00e9 analyz\u00e1tory zvl\u00e1daj\u00fa, ove\u013ea \u0161ir\u0161ie. Ve\u010f vo v\u0161eobecnosti je statick\u00e1 anal\u00fdza ak\u00e1ko\u013evek kontrola zdrojov\u00fdch k\u00f3dov vykonan\u00e1 pred ich spusten\u00edm. Tu je nieko\u013eko vec\u00ed, ktor\u00e9 je mo\u017en\u00e9 robi\u0165:<\/p>\n<ul>\n<li> Kontrola \u0161t\u00fdlu k\u00f3dovania v \u0161irokom zmysle tohto slova. Zah\u0155\u0148a to ako kontrolu form\u00e1tovania, tak aj h\u013eadanie pou\u017eitia pr\u00e1zdnych\/\u010di nadbyto\u010dn\u00fdch z\u00e1tvoriek, nastavenie prahov\u00fdch hodn\u00f4t na metriky, ako po\u010det riadkov\/cyklomatick\u00e1 zlo\u017eitos\u0165 met\u00f3dy at\u010f. \u2014 teda v\u0161etko, \u010do potenci\u00e1lne z\u0165a\u017euje \u010ditate\u013enos\u0165 a udr\u017eiavate\u013enos\u0165 k\u00f3du. V Jave je tak\u00fdmto n\u00e1strojom Checkstyle, v Pythone \u2014 flake8. Programy tohto druhu sa zvy\u010dajne naz\u00fdvaj\u00fa \u201elintery\u201c.<\/li>\n<li>Anal\u00fdze m\u00f4\u017ee podlieha\u0165 nielen vykonate\u013en\u00fd k\u00f3d. S\u00fabory s prostriedkami, ako s\u00fa JSON, YAML, XML, .properties, m\u00f4\u017eu (a mali by!) by\u0165 automaticky kontrolovan\u00e9 na platnos\u0165. Ve\u010f je lep\u0161ie dozvedie\u0165 sa o tom, \u017ee kv\u00f4li nejak\u00fdm nep\u00e1rov\u00fdm \u00favodzovk\u00e1m je \u0161trukt\u00fara JSON naru\u0161en\u00e1 v rannom \u0161t\u00e1diu automatickej kontroly Pull Requestu, ako pri vykon\u00e1van\u00ed testov alebo za behu aplik\u00e1cie? Zodpovedaj\u00face n\u00e1stroje s\u00fa k dispoz\u00edcii: napr\u00edklad, <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> Kompil\u00e1cia (alebo parsenie pre dynamick\u00e9 programovacie jazyky) je tie\u017e druh statickej anal\u00fdzy. Spravidla s\u00fa kompil\u00e1tory schopn\u00e9 vyd\u00e1va\u0165 varovania, ktor\u00e9 signalizuj\u00fa probl\u00e9my s kvalitou zdrojov\u00e9ho k\u00f3du, a tieto by sa nemali ignorova\u0165.<\/li>\n<li>Niekedy kompil\u00e1cia nie je len kompil\u00e1cia vykonate\u013en\u00e9ho k\u00f3du. Napr\u00edklad, ak m\u00e1te dokument\u00e1ciu vo form\u00e1te <noindex><a rel=\"nofollow\" href=\"https:\/\/asciidoctor.org\/\">AsciiDoctor<\/a><\/noindex>, v momente jej premeny na HTML\/PDF spracovate\u013e AsciiDoctor (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/asciidoctor\/asciidoctor-maven-plugin\">Maven plugin<\/a><\/noindex>) m\u00f4\u017ee vyd\u00e1va\u0165 varovania, napr\u00edklad o poru\u0161en\u00fdch vn\u00fatorn\u00fdch odkazoch. A to je d\u00f4vod, pre\u010do neprija\u0165 Pull Request s zmenami dokument\u00e1cie.<\/li>\n<li>Kontrola pravopisu je tie\u017e druh statickej anal\u00fdzy. N\u00e1stroj <noindex><a rel=\"nofollow\" href=\"http:\/\/aspell.net\/\">aspell<\/a><\/noindex> je schopn\u00fd kontrolova\u0165 pravopis nielen v dokument\u00e1cii, ale aj v zdrojov\u00fdch k\u00f3doch programov (v koment\u00e1roch a liter\u00e1loch) v r\u00f4znych programovac\u00edch jazykoch, vr\u00e1tane C\/C++, Java a Python. Chyba pri p\u00edsan\u00ed v pou\u017e\u00edvate\u013eskom rozhran\u00ed alebo dokument\u00e1cii je tie\u017e defect!<\/li>\n<li>Konfigura\u010dn\u00e9 testy (o tom, \u010do to je \u2014 pozri <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=KaeEjsAjV6A&amp;index=30&amp;list=PLsVTVVvrKX9tuYyCtL8mASB6IOaa-kRCA&amp;t=0s\">web<\/a><\/noindex> a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=Tk_nmV-mWOA\">web<\/a><\/noindex> predn\u00e1\u0161ky), hoci sa vykon\u00e1vaj\u00fa v prostred\u00ed modul\u00e1rnych testov typu pytest, s\u00fa v skuto\u010dnosti tie\u017e druhom statickej anal\u00fdzy, preto\u017ee nevykon\u00e1vaj\u00fa zdrojov\u00e9 k\u00f3dy po\u010das svojho vykon\u00e1vania.<\/li>\n<\/ul>\n<p>\nAko vid\u00edme, h\u013eadanie ch\u00fdb v tomto zozname zauj\u00edma najmenej d\u00f4le\u017eit\u00fa \u00falohu, zatia\u013e \u010do v\u0161etko ostatn\u00e9 je dostupn\u00e9 pou\u017eit\u00edm bezplatn\u00fdch open source n\u00e1strojov.<\/p>\n<p>Ktor\u00e9 z t\u00fdchto typov statickej anal\u00fdzy by ste mali aplikova\u0165 vo svojom projekte? Samozrejme, v\u0161etky \u2014 \u010d\u00edm viac, t\u00fdm lep\u0161ie! Podstatn\u00e9 je, implementova\u0165 to spr\u00e1vne, o \u010dom budeme hovori\u0165 \u010falej.<\/p>\n<h2>Dod\u00e1vkov\u00fd kan\u00e1l ako viacstup\u0148ov\u00fd filter a statick\u00e1 anal\u00fdza ako jeho prv\u00fd stupe\u0148<\/h2>\n<p>\nKlasickou metaforou nepretr\u017eitej integr\u00e1cie je potrubie (pipeline), ktor\u00fdm prech\u00e1dzaj\u00fa zmeny \u2014 od zmeny zdrojov\u00e9ho k\u00f3du po dodanie do produkcie. \u0160tandardn\u00e1 sekvencia krokov tohto kan\u00e1la vyzer\u00e1 takto:<\/p>\n<ol>\n<li>statick\u00e1 anal\u00fdza<\/li>\n<li>kompil\u00e1cia<\/li>\n<li>modulov\u00e9 testy<\/li>\n<li>integra\u010dn\u00e9 testy<\/li>\n<li>UI testy<\/li>\n<li>ru\u010dn\u00e9 overenie<\/li>\n<\/ol>\n<p>\nZmeny, ktor\u00e9 s\u00fa zamietnut\u00e9 v N-tom stupni kan\u00e1la, sa neprev\u00e1dzaj\u00fa na stupe\u0148 N+1.<\/p>\n<p>Pre\u010do pr\u00e1ve takto, a nie inak? V tej \u010dasti kan\u00e1la, ktor\u00e1 sa t\u00fdka testovania, testeri poznaj\u00fa \u0161iroko zn\u00e1me testovacie pyram\u00eddov\u00e9 pravidlo.<\/p>\n<p><img decoding=\"async\" alt=\"Implementujte statick\u00fa anal\u00fdzu do procesu, namiesto toho, aby ste h\u013eadali chyby pomocou nej\" src=\"\/wp-content\/uploads\/2019\/05\/f155307fd4c1663800843c394098ea6f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Testovacia pyram\u00edda. Zdroj: <noindex><a rel=\"nofollow\" href=\"https:\/\/martinfowler.com\/bliki\/TestPyramid.html\">\u010dl\u00e1nok<\/a><\/noindex> Martin Fowler.<\/i><\/p>\n<p>Na spodnej \u010dasti tejto pyram\u00eddy sa nach\u00e1dzaj\u00fa testy, ktor\u00e9 sa \u013eah\u0161ie p\u00ed\u0161u, r\u00fdchlej\u0161ie sa vykon\u00e1vaj\u00fa a nemaj\u00fa tendenciu k falo\u0161n\u00fdm spusteniam. Preto ich mus\u00ed by\u0165 viac, mali by pokr\u00fdva\u0165 viac k\u00f3du a vykon\u00e1va\u0165 sa prv\u00e9. Na vrchnej \u010dasti pyram\u00eddy je to naopak, preto by sa mno\u017estvo integra\u010dn\u00fdch a UI testov malo zredukova\u0165 na nevyhnutn\u00e9 minimum. \u010clovek v tomto re\u0165azci je najdrah\u0161\u00edm, najpomal\u0161\u00edm a najned\u00f4veryhodnej\u0161\u00edm zdrojom, a preto sa nach\u00e1dza na konci a vykon\u00e1va pr\u00e1cu iba v pr\u00edpade, ak predch\u00e1dzaj\u00face kroky neodhalili \u017eiadne defekty. Av\u0161ak pod\u013ea t\u00fdch ist\u00fdch princ\u00edpov je kon\u0161truovan\u00fd kan\u00e1l aj v \u010dastiach, ktor\u00e9 nie s\u00fa priamo spojen\u00e9 s testovan\u00edm!<\/p>\n<p>Chcel by som navrhn\u00fa\u0165 anal\u00f3giu v podobe viacstup\u0148ov\u00e9ho syst\u00e9mu filtr\u00e1cie vody. Na vstup prich\u00e1dza \u0161pinav\u00e1 voda (zmene s defektmi), na v\u00fdstupe mus\u00edme z\u00edska\u0165 \u010dist\u00fa vodu, v\u0161etky ne\u017eelan\u00e9 ne\u010distoty v ktorej s\u00fa odstr\u00e1nen\u00e9.<\/p>\n<p><img decoding=\"async\" alt=\"Implementujte statick\u00fa anal\u00fdzu do procesu, namiesto toho, aby ste h\u013eadali chyby pomocou nej\" src=\"\/wp-content\/uploads\/2019\/05\/76b5be8f13d55c16970d67e09767a045.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Viacstup\u0148ov\u00fd filter. Zdroj: <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>Ako je zn\u00e1me, \u010distiace filtre s\u00fa navrhnut\u00e9 tak, aby ka\u017ed\u00fd nasleduj\u00faci kask\u00e1dov\u00fd syst\u00e9m dok\u00e1zal zachyti\u0165 st\u00e1le men\u0161ie \u010dastice zne\u010distenia. Kask\u00e1dy s hrub\u0161\u00edm \u010disten\u00edm maj\u00fa pritom v\u00e4\u010d\u0161iu priepustnos\u0165 a ni\u017e\u0161ie n\u00e1klady. V na\u0161ej anal\u00f3gii to znamen\u00e1, \u017ee vstupn\u00e9 quality gates maj\u00fa vy\u0161\u0161\u00ed v\u00fdkon, vy\u017eaduj\u00fa menej \u00fasilia na spustenie a s\u00fa samy o sebe menej n\u00e1ro\u010dn\u00e9 na prev\u00e1dzku \u2014 a pr\u00e1ve v takom porad\u00ed s\u00fa usporiadan\u00e9. \u00daloha statickej anal\u00fdzy, ktor\u00e1, ako teraz ch\u00e1peme, dok\u00e1\u017ee odhali\u0165 iba tie najhrub\u0161ie defekty \u2014 to je \u00faloha sitka-\u201ezachyt\u00e1va\u010da ne\u010dist\u00f4t\u201c na za\u010diatku kask\u00e1dy filtrov.<\/p>\n<p>Statick\u00e1 anal\u00fdza sama o sebe nezlep\u0161\u00ed kvalitu kone\u010dn\u00e9ho produktu, ako \u201ezachyt\u00e1va\u010d ne\u010dist\u00f4t\u201c neurob\u00ed vodu pitnou. Napriek tomu je v kontexte in\u00fdch prvkov v\u00fdrobn\u00e9ho procesu jej v\u00fdznam o\u010dividn\u00fd. Hoci vo viacstup\u0148ovom filtri v\u00fdstupn\u00e9 kask\u00e1dy potenci\u00e1lne dok\u00e1\u017eu zachyti\u0165 to ist\u00e9, \u010do aj vstupn\u00e9 \u2014 je jasn\u00e9, ak\u00e9 d\u00f4sledky prinesie pokus spolieha\u0165 sa iba na kask\u00e1dy jemn\u00e9ho \u010distenia, bez vstupn\u00fdch kask\u00e1d.<\/p>\n<p>Cie\u013eom \u201ezachyt\u00e1va\u010da ne\u010dist\u00f4t\u201c je uvo\u013eni\u0165 nasleduj\u00face kask\u00e1dy od zachyt\u00e1vania naozaj hrub\u00fdch defektov. Napr\u00edklad aspo\u0148 osoba vykon\u00e1vaj\u00faca code review by sa nemala rozpty\u013eova\u0165 nespr\u00e1vne naform\u00e1tovan\u00fdm k\u00f3dom a poru\u0161en\u00edm stanoven\u00fdch noriem k\u00f3dovania (napr\u00edklad nadbyto\u010dn\u00fdmi z\u00e1tvorkami alebo pr\u00edli\u0161 hlbok\u00fdm zano\u0159en\u00edm vetvenia). Chyby typu NPE by mali by\u0165 zachyten\u00e9 modulov\u00fdmi testami, ale ak n\u00e1m analyz\u00e1tor e\u0161te pred testom nazna\u010d\u00ed, \u017ee chyba sa nevyhnutne vyskytne \u2014 to v\u00fdrazne ur\u00fdchli jej opravu.<\/p>\n<p>Domnievam sa, \u017ee teraz je jasn\u00e9, pre\u010do statick\u00e1 anal\u00fdza nezlep\u0161uje kvalitu produktu, ak sa pou\u017e\u00edva epizodicky, a mala by sa aplikova\u0165 neust\u00e1le na odstra\u0148ovanie zmien s hrub\u00fdmi defektmi. Ot\u00e1zka, \u010di pou\u017eitie statick\u00e9ho analyz\u00e1tora zlep\u0161\u00ed kvalitu v\u00e1\u0161ho produktu, je zhruba ekvivalentn\u00e1 ot\u00e1zke \u201ezlep\u0161ia sa pitn\u00e9 vlastnosti vody odobranej z zne\u010disten\u00e9ho vodn\u00e9ho zdroja, ak ju preleje\u0161 cez cedn\u00edk?\u201c<\/p>\n<h2>Zavedenie do legacy-projektu<\/h2>\n<p>\nD\u00f4le\u017eit\u00e1 praktick\u00e1 ot\u00e1zka: ako implementova\u0165 statick\u00fa anal\u00fdzu do procesu kontinu\u00e1lnej integr\u00e1cie ako \u201equality gate\u201c? V pr\u00edpade automatick\u00fdch testov je to jasn\u00e9: existuje mno\u017estvo testov, zlyhanie ktor\u00e9hoko\u013evek z nich je dostato\u010dn\u00fdm z\u00e1kladom pova\u017eova\u0165, \u017ee zostava nepre\u0161la quality gate. Pokus o nastavenie gate na z\u00e1klade v\u00fdsledkov statickej anal\u00fdzy zlyh\u00e1va: na legacy k\u00f3de je varovan\u00ed z anal\u00fdzy pr\u00edli\u0161 ve\u013ea, \u00faplne ich ignorova\u0165 nechceme, ale ani zastavova\u0165 dod\u00e1vku produktu iba preto, \u017ee obsahuje varovania analyz\u00e1tora, nie je mo\u017en\u00e9.<\/p>\n<p>Ke\u010f sa prv\u00fdkr\u00e1t pou\u017eije, na akomko\u013evek projekte analyz\u00e1tor vyd\u00e1va obrovsk\u00e9 mno\u017estvo varovan\u00ed, pri\u010dom drviv\u00e1 v\u00e4\u010d\u0161ina z nich nem\u00e1 ni\u010d spolo\u010dn\u00e9 s funk\u010dnos\u0165ou produktu. Opravi\u0165 v\u0161etky tieto pripomienky naraz nie je mo\u017en\u00e9 a mnoh\u00e9 \u2014 ani potrebn\u00e9. Napokon, predsa vieme, \u017ee n\u00e1\u0161 produkt celkovo funguje a to pred uveden\u00edm statickej anal\u00fdzy!<\/p>\n<p>Nakoniec sa mnoh\u00ed obmedzuj\u00fa na epizodick\u00e9 pou\u017e\u00edvanie statickej anal\u00fdzy, alebo ju pou\u017e\u00edvaj\u00fa iba v re\u017eime informovania, ke\u010f sa pri zostaven\u00ed jednoducho vyd\u00e1va spr\u00e1va analyz\u00e1tora. To je ekvivalentn\u00e9 absencii akejko\u013evek anal\u00fdzy, preto\u017ee ak u\u017e m\u00e1me mno\u017estvo varovan\u00ed, vznik \u010fal\u0161ieho (hne\u010f \u010diasto\u010dne v\u00e1\u017eneho) pri zmene k\u00f3du zost\u00e1va nepov\u0161imnut\u00fd.<\/p>\n<p>S\u00fa zn\u00e1me nasleduj\u00face sp\u00f4soby zavedenia quality gates:<\/p>\n<ul>\n<li>Nastavenie limitu celkov\u00e9ho po\u010dtu varovan\u00ed alebo po\u010dtu varovan\u00ed delen\u00e9ho po\u010dtom riadkov k\u00f3du. Funguje to zle, preto\u017ee tak\u00fd gate vo\u013ene prep\u00fa\u0161\u0165a zmeny s nov\u00fdmi defektmi, pokia\u013e nie je prekro\u010den\u00fd ich limit.<\/li>\n<li>Zaznamenanie v\u0161etk\u00fdch star\u00fdch varovan\u00ed v k\u00f3de ako ignorovan\u00fdch v ur\u010dit\u00fdch momentoch a odmietnutie zostavenia pri vzniku nov\u00fdch varovan\u00ed. T\u00fato funkcionalitu poskytuje PVS-studio a niektor\u00e9 online zdroje, napr\u00edklad Codacy. Nemal som sk\u00fasenosti s PVS-studio, \u010do sa t\u00fdka m\u00f4jho sk\u00fasenosti s Codacy, ich hlavn\u00fd probl\u00e9m spo\u010d\u00edva v tom, \u017ee ur\u010dovanie, \u010do je \u201estar\u00e1\u201c, a \u010do \u201enov\u00e1\u201c chyba, je pomerne zlo\u017eit\u00fd a nie v\u017edy spr\u00e1vne funguj\u00faci algoritmus, najm\u00e4 ak sa s\u00fabory v\u00fdrazne menia alebo premen\u00favaj\u00fa. Pod\u013ea mojej pam\u00e4te Codacy mohol presko\u010di\u0165 nov\u00e9 varovania v pull requeste, a z\u00e1rove\u0148 neumo\u017eni\u0165 pull request kv\u00f4li varovaniam, ktor\u00e9 sa net\u00fdkaj\u00fa zmien v k\u00f3de tohto PR.<\/li>\n<li>Pod\u013ea m\u00f4jho n\u00e1zoru je naj\u00fa\u010dinnej\u0161\u00edm rie\u0161en\u00edm to, ktor\u00e9 je op\u00edsan\u00e9 v knihe <noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Continuous-Delivery-Deployment-Automation-Addison-Wesley\/dp\/0321601912\">Kontinu\u00e1lne dod\u00e1vanie<\/a><\/noindex> \u201emet\u00f3da hra\u010dky\u201c (\u201eratcheting\u201c). Hlavn\u00e1 my\u0161lienka spo\u010d\u00edva v tom, \u017ee vlastnos\u0165 ka\u017ed\u00e9ho vydania je po\u010det varovan\u00ed statickej anal\u00fdzy, a s\u00fa povolen\u00e9 len tak\u00e9 zmeny, ktor\u00e9 celkov\u00fd po\u010det varovan\u00ed nezvy\u0161uj\u00fa.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Hra\u010dka<\/h2>\n<p>\nFunguje to nasledovne:<\/p>\n<ol>\n<li>V po\u010diato\u010dnej f\u00e1ze sa zaznamen\u00e1va do metad\u00e1t o vydan\u00ed po\u010det varovan\u00ed v k\u00f3de, ktor\u00e9 na\u0161li analyz\u00e1tory. T\u00fdmto sp\u00f4sobom sa pri zostaven\u00ed hlavnej vetvy do v\u00e1\u0161ho spr\u00e1vcu repozit\u00e1rov zapisuje nie len \u201evydanie 7.0.2\u201c, ale \u201evydanie 7.0.2, obsahuj\u00face 100500 varovan\u00ed Checkstyle\u201c. Ak pou\u017e\u00edvate pokro\u010dil\u00e9ho spr\u00e1vcu repozit\u00e1rov (tak\u00e9ho ako Artifactory), uchova\u0165 tak\u00e9to metad\u00e1ta o va\u0161om vydan\u00ed je jednoduch\u00e9.<\/li>\n<li>Teraz ka\u017ed\u00fd pull request pri zostaven\u00ed porovn\u00e1va po\u010det z\u00edskan\u00fdch varovan\u00ed s t\u00fdm, ak\u00e9 mno\u017estvo je v aktu\u00e1lnom vydan\u00ed. Ak PR vedie k zv\u00fd\u0161eniu tohto \u010d\u00edsla, k\u00f3d neprejde kvalitat\u00edvnou br\u00e1nou pri statickej anal\u00fdze. Ak sa po\u010det varovan\u00ed zni\u017euje alebo nemen\u00ed \u2014 prejde.<\/li>\n<li>Pri \u010fal\u0161om vydan\u00ed bude znovu zap\u00edsan\u00e9 prepo\u010d\u00edtan\u00e9 mno\u017estvo varovan\u00ed do metad\u00e1t vydania.<\/li>\n<\/ol>\n<p>\nTakto pomaly, ale neochvejne (ako pri pr\u00e1ci s ratchetom), po\u010det varovan\u00ed sa bude sna\u017ei\u0165 o nulu. Samozrejme, syst\u00e9m je mo\u017en\u00e9 oklama\u0165 pridan\u00edm nov\u00e9ho varovania, ale opravou cudzieho. Je to v poriadku, preto\u017ee v dlhodobom horizonte to prin\u00e1\u0161a v\u00fdsledky: varovania sa opravuj\u00fa, ako pravidlo, nie jedno po druhom, ale hromadne v ur\u010ditej skupine a v\u0161etky \u013eahko odstr\u00e1nite\u013en\u00e9 varovania sa pomerne r\u00fdchlo odstr\u00e1nia.<\/p>\n<p>Na tomto grafe je zobrazen\u00fd celkov\u00fd po\u010det varovan\u00ed Checkstyle za pol roka fungovania tak\u00e9ho \u201eratchetu\u201c na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\">jednom z na\u0161ich projektov OpenSource<\/a><\/noindex>. Po\u010det varovan\u00ed sa zn\u00ed\u017eil o poriadok, pri\u010dom sa to udialo prirodzene, s\u00fabe\u017ene s v\u00fdvojom produktu!<\/p>\n<p><img decoding=\"async\" alt=\"Implementujte statick\u00fa anal\u00fdzu do procesu, namiesto toho, aby ste h\u013eadali chyby pomocou nej\" src=\"\/wp-content\/uploads\/2019\/05\/9529bb2fb32187057088e8d2c4203333.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPou\u017e\u00edvam modifikovan\u00fa verziu tejto met\u00f3dy, pri\u010dom samostatne po\u010d\u00edtam varovania s rozdelen\u00edm pod\u013ea modulov projektu a analyza\u010dn\u00fdch n\u00e1strojov, pri\u010dom vytvoren\u00fd YAML s\u00fabor s metad\u00e1tami o zostaven\u00ed vyzer\u00e1 pribli\u017ene takto:<\/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>\nV akejko\u013evek pokro\u010dilej CI-syst\u00e9me m\u00f4\u017eeme realizova\u0165 \u201eratchet\u201c pre ak\u00e9ko\u013evek n\u00e1stroje statickej anal\u00fdzy, bez spol\u00edhania na pluginy a extern\u00e9 n\u00e1stroje. Ka\u017ed\u00fd z analyz\u00e1torov vyd\u00e1va svoju spr\u00e1vu v jednoduchom textovom alebo XML form\u00e1te, ktor\u00fd je \u013eahko analyzovate\u013en\u00fd. Ost\u00e1va len zap\u00edsa\u0165 potrebn\u00fa logiku do CI skriptu. In\u0161pirova\u0165 sa, ako to je realizovan\u00e9 v na\u0161ich open source projektoch zalo\u017een\u00fdch na Jenkins a Artifactory, je mo\u017en\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/2bass\/blob\/dev\/Jenkinsfile\">tu<\/a><\/noindex> alebo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\/blob\/dev\/Jenkinsfile\">tu<\/a><\/noindex>. Obe pr\u00edklady s\u00fa z\u00e1visl\u00e9 od kni\u017enice <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/inponomarev\/ratchetlib\">ratchetlib<\/a><\/noindex>: met\u00f3da <code>countWarnings()<\/code> be\u017ene po\u010d\u00edta xml zna\u010dky v s\u00faboroch vytvoren\u00fdch Checkstyle a Spotbugs, a <code>compareWarningMaps()<\/code> realizuje ten skuto\u010dn\u00fd ratchet, vyhadzuj\u00fac chybu v pr\u00edpade, \u017ee po\u010det varovan\u00ed v ktorejko\u013evek zo skup\u00edn sa zvy\u0161uje.<\/p>\n<p>Zauj\u00edmavou implement\u00e1ciou \u201ere\u0165azovej prevodovky\u201c je anal\u00fdza pravopisu koment\u00e1rov, textov\u00fdch liter\u00e1lov a dokument\u00e1cie pomocou aspell. Ako je zn\u00e1me, pri kontrole pravopisu nie v\u0161etky slov\u00e1, ktor\u00e9 nie s\u00fa zn\u00e1me \u0161tandardn\u00e9mu slovn\u00edku, s\u00fa nespr\u00e1vne; m\u00f4\u017eu by\u0165 pridan\u00e9 do pou\u017e\u00edvate\u013esk\u00e9ho slovn\u00edka. Ak urob\u00edte pou\u017e\u00edvate\u013esk\u00fd slovn\u00edk s\u00fa\u010das\u0165ou zdrojov\u00e9ho k\u00f3du projektu, kvalitat\u00edvna br\u00e1na pre pravopis m\u00f4\u017ee by\u0165 formulovan\u00e1 takto: vykonanie aspell so \u0161tandardn\u00fdm a pou\u017e\u00edvate\u013esk\u00fdm slovn\u00edkom. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\/blob\/271dcfc8dc3ad65ac2d1dcaa39b7fd3ea8fb5891\/Jenkinsfile#L36\">by nemali<\/a><\/noindex> n\u00e1js\u0165 \u017eiadne pravopisn\u00e9 chyby.<\/p>\n<h2>O d\u00f4le\u017eitosti fix\u00e1cie verzie analyz\u00e1tora<\/h2>\n<p>\nNa z\u00e1ver je potrebn\u00e9 poznamena\u0165 nasledovn\u00e9: ak\u00fdmko\u013evek sp\u00f4sobom by ste nechceli implementova\u0165 anal\u00fdzu do v\u00e1\u0161ho dod\u00e1vacieho procesu, verzia analyz\u00e1tora by mala by\u0165 fixovan\u00e1. Ak by do\u0161lo k samovo\u013enej aktualiz\u00e1cii analyz\u00e1tora, pri zostavovan\u00ed \u010fal\u0161ieho pull request-u sa m\u00f4\u017eu objavi\u0165 nov\u00e9 defekty, ktor\u00e9 nie s\u00fa spojen\u00e9 so zmenou k\u00f3du, ale s\u00favisia s t\u00fdm, \u017ee nov\u00fd analyz\u00e1tor dok\u00e1\u017ee n\u00e1js\u0165 viac defektov \u2014 a to v\u00e1m rozbije proces schva\u013eovania pull request-ov. Aktualiz\u00e1cia analyz\u00e1tora by mala by\u0165 vedom\u00fdm krokom. Napriek tomu je pr\u00edsna fix\u00e1cia verzie ka\u017edej zostavovacej komponenty vo v\u0161eobecnosti nevyhnutn\u00fdm po\u017eiadavkom a t\u00e9mou na osobitn\u00fa diskusiu.<\/p>\n<h2>Zhrnutie<\/h2>\n<p><\/p>\n<ul>\n<li>Statick\u00e1 anal\u00fdza v\u00e1m nen\u00e1jde bugy a nezlep\u0161uje kvalitu v\u00e1\u0161ho produktu v d\u00f4sledku jednorazov\u00e9ho pou\u017eitia. Pozit\u00edvny efekt na kvalitu prin\u00e1\u0161a len jej trval\u00e9 uplat\u0148ovanie po\u010das dod\u00e1vky.<\/li>\n<li>H\u013eadanie bugov nie je v\u00f4bec hlavnou \u00falohou anal\u00fdzy; prevl\u00e1daj\u00faca v\u00e4\u010d\u0161ina u\u017eito\u010dn\u00fdch funkci\u00ed je dostupn\u00e1 v opensource n\u00e1strojoch.<\/li>\n<li>Implementujte kvalitat\u00edvne br\u00e1ny na z\u00e1klade v\u00fdsledkov statickej anal\u00fdzy u\u017e v prvom \u0161t\u00e1diu dod\u00e1vacieho procesu, pou\u017e\u00edvaj\u00fac \u201ere\u0165azov\u00fa prevodovku\u201c pre legacy k\u00f3d.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Odkazy<\/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\">Kontinu\u00e1lne dod\u00e1vanie<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=8Cx3LHNjI24\">A. Kudrjavcev: Anal\u00fdza programov: ako pochopi\u0165, \u017ee ste dobr\u00fd program\u00e1tor<\/a><\/noindex> predn\u00e1\u0161ka o r\u00f4znych met\u00f3dach anal\u00fdzy k\u00f3du (nielen statickej!)<\/li>\n<\/ol>\n<p>Zdroj: <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.4 - 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.\" \/>\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\/sk\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\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.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sk\/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\udd47Implementujte statick\u00fa anal\u00fdzu do procesu, a nie h\u013eadajte s jej pomocou bugy | ProHoster","description":"Nap\u00edsa\u0165 tento \u010dl\u00e1nok ma podnietilo ve\u013ek\u00e9 mno\u017estvo materi\u00e1lov o statickej anal\u00fdze, ktor\u00e9 sa \u010doraz \u010dastej\u0161ie dost\u00e1vaj\u00fa do o\u010d\u00ed.","canonical_url":"https:\/\/prohoster.info\/sk\/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":"sk_SK","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.","og:url":"https:\/\/prohoster.info\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/32848","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=32848"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/32848\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/24622"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=32848"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=32848"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=32848"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}