{"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\/hu\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","title":{"rendered":"Integr\u00e1lja a statikus elemz\u00e9st a folyamat\u00e1ba, ne csak hib\u00e1k keres\u00e9s\u00e9re haszn\u00e1lja","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ezt a cikket a statikus elemz\u00e9sr\u0151l sz\u00f3l\u00f3 sz\u00e1mos anyag ihlette, amelyek egyre gyakrabban t\u0171nnek fel. El\u0151sz\u00f6r is, ez a <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/\">PVS-studio blogja<\/a><\/noindex>, amely akt\u00edvan rekl\u00e1mozza mag\u00e1t a Habr-on a hib\u00e1k \u00e1ttekint\u00e9sein kereszt\u00fcl, amelyeket az \u0151 eszk\u00f6z\u00fck fedezett fel ny\u00edlt forr\u00e1sk\u00f3d\u00fa projektekben. Nemr\u00e9g a PVS-studio <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/436496\/\">t\u00e1mogat\u00e1st val\u00f3s\u00edtott meg Java-hoz<\/a><\/noindex>, \u00e9s term\u00e9szetesen az IntelliJ IDEA fejleszt\u0151i, akinek be\u00e9p\u00edtett elemz\u0151je val\u00f3sz\u00edn\u0171leg a legfejlettebb a Java sz\u00e1m\u00e1ra, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/JetBrains\/blog\/436278\/\">nem maradhattak k\u00edv\u00fcl<\/a><\/noindex>. <\/p>\n<p>Az ilyen \u00e1ttekint\u00e9sek olvas\u00e1sakor olyan \u00e9rz\u00e9s\u00fcnk van, mintha egy var\u00e1zslatos f\u0151zet volna: csak nyomj meg egy gombot, \u00e9s itt van \u2014 a hib\u00e1k list\u00e1ja a szemed el\u0151tt. \u00dagy t\u0171nik, hogy ahogy az elemz\u0151k fejlettebb\u00e9 v\u00e1lnak, egyre t\u00f6bb hib\u00e1t tal\u00e1lnak automatikusan, \u00e9s azok a term\u00e9kek, amelyeket ezek a robotok \u00e1tvizsg\u00e1lnak, egyre jobbak lesznek, an\u00e9lk\u00fcl, hogy b\u00e1rmilyen er\u0151fesz\u00edt\u00e9st tenn\u00e9nk.<\/p>\n<p>De var\u00e1zslatos f\u0151zetek nem l\u00e9teznek. Szeretn\u00e9k besz\u00e9lni arr\u00f3l, amir\u0151l \u00e1ltal\u00e1ban nem besz\u00e9lnek az olyan bejegyz\u00e9sekben, mint a \"mit k\u00e9pes felfedezni a robotunk\": mit nem tudnak az elemz\u0151k, mi a val\u00f3di szerep\u00fck \u00e9s hely\u00fck a szoftver sz\u00e1ll\u00edt\u00e1si folyamat\u00e1ban, \u00e9s hogyan kell \u0151ket helyesen bevezetni.<\/p>\n<p><img decoding=\"async\" alt=\"Integr\u00e1lja a statikus elemz\u00e9st a folyamat\u00e1ba, ne csak hib\u00e1k keres\u00e9s\u00e9re haszn\u00e1lja\" src=\"\/wp-content\/uploads\/2019\/05\/2a0339f10edcaed3310676ab6e2f975a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Egy p\u00e9ld\u00e1t eml\u00edten\u00e9k (forr\u00e1s: <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>) Amit a statikus elemz\u0151k sosem fognak tudni<\/h2>\n<p>\nMi az, a gyakorlatban, az forr\u00e1sk\u00f3d elemz\u00e9s? Adunk bemenetk\u00e9nt egyes forr\u00e1sokat, \u00e9s a kimenetk\u00e9nt r\u00f6vid id\u0151n bel\u00fcl (sokkal r\u00f6videbb id\u0151 alatt, mint a tesztek futtat\u00e1sa) inform\u00e1ci\u00f3kat kapunk a rendszer\u00fcnkr\u0151l. Az alapvet\u0151 \u00e9s matematikailag elker\u00fclhetetlen korl\u00e1toz\u00e1s az, hogy \u00edgy csak egy meglehet\u0151sen sz\u0171k inform\u00e1ci\u00f3k\u00f6rt tudunk megszerezni.<\/p>\n<p>A legismertebb p\u00e9lda egy olyan probl\u00e9m\u00e1ra, amelyet nem lehet statikus elemz\u00e9s seg\u00edts\u00e9g\u00e9vel megoldani \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Halting_problem\">a meg\u00e1ll\u00e1si probl\u00e9ma<\/a><\/noindex>: ez egy t\u00e9tel, amely bebizony\u00edtja, hogy lehetetlen egy \u00e1ltal\u00e1nos algoritmust kidolgozni, amely a program forr\u00e1sk\u00f3dja alapj\u00e1n meghat\u00e1rozza, hogy az v\u00e9gtelen ciklusba ker\u00fcl-e vagy v\u00e9ges id\u0151n bel\u00fcl befejez\u0151dik. E t\u00e9tel kiterjeszt\u00e9se a <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Rice%27s_theorem\">Rice-t\u00e9tel<\/a><\/noindex>A defin\u00edci\u00f3ja annak, hogy egy tetsz\u0151leges program k\u00e9pes-e kisz\u00e1m\u00edtani egy tetsz\u0151leges nem trivi\u00e1lis tulajdons\u00e1g\u00fa sz\u00e1m\u00edt\u00e1si funkci\u00f3t, algoritmikusan nem megoldhat\u00f3 feladat. P\u00e9ld\u00e1ul lehetetlen \u00edrni egy elemz\u0151t, amely meg tudja hat\u00e1rozni b\u00e1rmilyen forr\u00e1ssal, hogy a vizsg\u00e1lt program egy algoritmus implement\u00e1ci\u00f3ja, amely p\u00e9ld\u00e1ul egy eg\u00e9sz sz\u00e1m n\u00e9gyzetre emel\u00e9s\u00e9t v\u00e9gzi.<\/p>\n<p>Ez\u00e9rt a statikus elemz\u0151k funkcionalit\u00e1sa megk\u00e9rd\u0151jelezhetetlen korl\u00e1tokkal rendelkezik. A statikus elemz\u0151 soha nem tudja minden esetben meghat\u00e1rozni az olyan dolgokat, mint p\u00e9ld\u00e1ul a \"null pointer exception\" fell\u00e9p\u00e9se azokon a nyelveken, amelyek megengedik a null \u00e9rt\u00e9ket, vagy minden esetben az \"attribute not found\" el\u0151fordul\u00e1s\u00e1t olyan dinamikusan t\u00edpusos nyelvekn\u00e9l. Amit a legfejlettebb statikus elemz\u0151 tud tenni, az az, hogy kiemeli az olyan speci\u00e1lis eseteket, amelyek sz\u00e1ma a lehets\u00e9ges probl\u00e9m\u00e1khoz k\u00e9pest az \u00d6n forr\u00e1sk\u00f3dj\u00e1ban, nem t\u00falz\u00f3 m\u00f3don, egy csepp a tengerben.<\/p>\n<h2>A statikus elemz\u00e9s nem hibakeres\u00e9s.<\/h2>\n<p>\nAz eddigiekb\u0151l a k\u00f6vetkez\u0151 k\u00f6vetkeztet\u00e9s vonhat\u00f3 le: a statikus elemz\u00e9s nem eszk\u00f6z a program hib\u00e1inak cs\u00f6kkent\u00e9s\u00e9re. Merem \u00e1ll\u00edtani: amikor el\u0151sz\u00f6r alkalmazz\u00e1k a projektj\u00e9ben, \u00e9rdekes helyeket tal\u00e1l a k\u00f3dban, de val\u00f3sz\u00edn\u0171leg nem fogja \u00e9szlelni a programja m\u0171k\u00f6d\u00e9s\u00e9re hat\u00e1ssal l\u00e9v\u0151 hib\u00e1kat.<\/p>\n<p>Az elemz\u0151k \u00e1ltal automatikusan felfedezett hib\u00e1k p\u00e9ld\u00e1i leny\u0171g\u00f6z\u0151ek, de ne feledj\u00fck, hogy ezek a p\u00e9ld\u00e1k nagy k\u00f3db\u00e1zisok sz\u00e9les k\u00f6r\u0171 \u00e1tvizsg\u00e1l\u00e1sa r\u00e9v\u00e9n ker\u00fcltek el\u0151. Ugyanezen elv alapj\u00e1n a hackerek, akik k\u00e9pesek t\u00f6bb egyszer\u0171 jelsz\u00f3t megpr\u00f3b\u00e1lni sok fi\u00f3kn\u00e1l, v\u00e9g\u00fcl megtal\u00e1lj\u00e1k azokat a fi\u00f3kokat, ahol egyszer\u0171 jelsz\u00f3 tal\u00e1lhat\u00f3.<\/p>\n<p>Jelenti ez, hogy a statikus elemz\u00e9st nem szabad alkalmazni? Term\u00e9szetesen nem! Ugyanazon okb\u00f3l, ami\u00e9rt minden \u00faj jelsz\u00f3t \u00e9rdemes leellen\u0151rizni a \"kev\u00e9sb\u00e9 biztons\u00e1gos\" jelszavak fekete list\u00e1j\u00e1n.<\/p>\n<h2>A statikus elemz\u00e9s t\u00f6bb, mint hibakeres\u00e9s.<\/h2>\n<p>\nVal\u00f3j\u00e1ban a megoldhat\u00f3 elemz\u00e9si feladatok sokkal sz\u00e9lesebb k\u00f6r\u0171ek. Az \u00e1ltal\u00e1nos statikus elemz\u00e9s b\u00e1rmilyen forr\u00e1sk\u00f3d-ellen\u0151rz\u00e9s, amelyet a futtat\u00e1s el\u0151tt v\u00e9geznek. \u00cdme n\u00e9h\u00e1ny dolog, amit tenni lehet:<\/p>\n<ul>\n<li> A k\u00f3dol\u00e1s st\u00edlus\u00e1nak ellen\u0151rz\u00e9se t\u00e1g \u00e9rtelemben. Ide tartozik a form\u00e1z\u00e1s ellen\u0151rz\u00e9se, valamint a felesleges z\u00e1r\u00f3jelek haszn\u00e1lat\u00e1nak keres\u00e9se, k\u00fcsz\u00f6b\u00e9rt\u00e9kek be\u00e1ll\u00edt\u00e1sa olyan metrik\u00e1kra, mint a sorok sz\u00e1ma vagy a m\u00f3dszer ciklomatikus bonyolults\u00e1ga, \u00e9s \u00edgy tov\u00e1bb \u2014 minden, ami potenci\u00e1lisan megnehez\u00edti a k\u00f3d olvashat\u00f3s\u00e1g\u00e1t \u00e9s karbantart\u00e1s\u00e1t. Java eset\u00e9ben ilyen eszk\u00f6z a Checkstyle, Pythonban pedig a flake8. Az ilyen t\u00edpus\u00fa programokat \u00e1ltal\u00e1ban \"lintereknek\" h\u00edvj\u00e1k.<\/li>\n<li>Nemcsak a v\u00e9grehajthat\u00f3 k\u00f3d anal\u00edzisnek van al\u00e1vetve. Az er\u0151forr\u00e1sf\u00e1jlok, mint a JSON, YAML, XML, .properties automatikusan valid\u00e1lhat\u00f3k (\u00e9s kell is!), hiszen jobb tudni, hogy egy p\u00e1ratlan id\u00e9z\u0151jel miatt megs\u00e9r\u00fclt a JSON strukt\u00far\u00e1ja, mint amikor a tesztek fut\u00e1sa vagy a fut\u00e1sid\u0151 sor\u00e1n der\u00fcl ki. Vannak megfelel\u0151 eszk\u00f6z\u00f6k: p\u00e9ld\u00e1ul <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> A ford\u00edt\u00e1s (vagy a dinamikus programoz\u00e1si nyelvek eset\u00e9n parse-ol\u00e1s) szint\u00e9n a statikus anal\u00edzis egy form\u00e1ja. \u00c1ltal\u00e1ban a ford\u00edt\u00f3k figyelmeztet\u00e9seket adhatnak, amelyek a forr\u00e1sk\u00f3d min\u0151s\u00e9gi probl\u00e9m\u00e1ira utalnak, \u00e9s ezeket nem szabad figyelmen k\u00edv\u00fcl hagyni.<\/li>\n<li>N\u00e9ha a ford\u00edt\u00e1s nem csup\u00e1n a v\u00e9grehajthat\u00f3 k\u00f3d ford\u00edt\u00e1sa. P\u00e9ld\u00e1ul, ha a dokument\u00e1ci\u00f3s form\u00e1tumod <noindex><a rel=\"nofollow\" href=\"https:\/\/asciidoctor.org\/\">AsciiDoctor<\/a><\/noindex>, akkor amikor azt HTML\/PDF form\u00e1tumba alak\u00edtod, az AsciiDoctor feldolgoz\u00f3 (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/asciidoctor\/asciidoctor-maven-plugin\">Maven plugin<\/a><\/noindex>) figyelmeztet\u00e9seket adhat, p\u00e9ld\u00e1ul megs\u00e9rtett bels\u0151 linkekr\u0151l. Ez jelent\u0151s ok arra, hogy ne fogadjuk el a dokument\u00e1ci\u00f3s m\u00f3dos\u00edt\u00e1sokat tartalmaz\u00f3 Pull Requestet.<\/li>\n<li>A helyes\u00edr\u00e1s-ellen\u0151rz\u00e9s is a statikus anal\u00edzis egy form\u00e1ja. Az eszk\u00f6z <noindex><a rel=\"nofollow\" href=\"http:\/\/aspell.net\/\">aspell<\/a><\/noindex> k\u00e9pes ellen\u0151rizni a helyes\u00edr\u00e1st nemcsak a dokument\u00e1ci\u00f3ban, hanem a programok forr\u00e1sk\u00f3djaiban (kommentek \u00e9s liter\u00e1lok) is, k\u00fcl\u00f6nb\u00f6z\u0151 programoz\u00e1si nyelveken, \u00edgy p\u00e9ld\u00e1ul C\/C++, Java \u00e9s Python nyelveken. Egy felhaszn\u00e1l\u00f3i fel\u00fcleten vagy a dokument\u00e1ci\u00f3ban elk\u00f6vetett helyes\u00edr\u00e1si hiba szint\u00e9n hiba!<\/li>\n<li>A konfigur\u00e1ci\u00f3s tesztek (hogy mit jelentenek, l\u00e1sd <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=KaeEjsAjV6A&amp;index=30&amp;list=PLsVTVVvrKX9tuYyCtL8mASB6IOaa-kRCA&amp;t=0s\">az<\/a><\/noindex> \u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=Tk_nmV-mWOA\">az<\/a><\/noindex> jelent\u00e9sek), b\u00e1r a pytest t\u00edpus\u00fa modul\u00e1ris tesztek fut\u00e1si k\u00f6rnyezet\u00e9ben hajtj\u00e1k v\u00e9gre \u0151ket, val\u00f3j\u00e1ban a statikus anal\u00edzis egy form\u00e1j\u00e1nak sz\u00e1m\u00edtanak, mivel nem hajtj\u00e1k v\u00e9gre a forr\u00e1sk\u00f3dokat a fut\u00e1suk sor\u00e1n.<\/li>\n<\/ul>\n<p>\nAhogy l\u00e1tjuk, a hib\u00e1k keres\u00e9se a list\u00e1ban a legkev\u00e9sb\u00e9 fontos szerepet j\u00e1tszik, m\u00edg minden egy\u00e9b ingyenes open source eszk\u00f6z\u00f6k haszn\u00e1lat\u00e1val el\u00e9rhet\u0151.<\/p>\n<p>Milyen t\u00edpus\u00fa statikus elemz\u00e9seket \u00e9rdemes alkalmazni a projektj\u00e9ben? Term\u00e9szetesen mindet, min\u00e9l t\u00f6bb, ann\u00e1l jobb! A l\u00e9nyeg, hogy ezt helyesen vezess\u00fck be, err\u0151l lesz sz\u00f3 a k\u00f6vetkez\u0151kben.<\/p>\n<h2>A sz\u00e1ll\u00edt\u00e1si cs\u0151vezet\u00e9k mint t\u00f6bbl\u00e9pcs\u0151s sz\u0171r\u0151 \u00e9s a statikus elemz\u00e9s mint az els\u0151 l\u00e9pcs\u0151<\/h2>\n<p>\nA folyamatos integr\u00e1ci\u00f3 klasszikus metafor\u00e1ja a cs\u0151vezet\u00e9k, amelyen kereszt\u00fcl a v\u00e1ltoztat\u00e1sok \u00e1ramlanak \u2014 a forr\u00e1sk\u00f3d v\u00e1ltoztat\u00e1s\u00e1t\u00f3l a termel\u00e9si k\u00f6rnyezetbe t\u00f6rt\u00e9n\u0151 kiad\u00e1sig. A cs\u0151vezet\u00e9k standard szakaszainak sorrendje a k\u00f6vetkez\u0151k\u00e9ppen n\u00e9z ki:<\/p>\n<ol>\n<li>statisztikai elemz\u00e9s<\/li>\n<li>ford\u00edt\u00e1s<\/li>\n<li>modul tesztek<\/li>\n<li>integr\u00e1ci\u00f3s tesztek<\/li>\n<li>UI tesztek<\/li>\n<li>k\u00e9zi ellen\u0151rz\u00e9s<\/li>\n<\/ol>\n<p>\nAz N-edik szakaszban elutas\u00edtott v\u00e1ltoz\u00e1sok nem tov\u00e1bb\u00edthat\u00f3k az N+1 szakaszra.<\/p>\n<p>Mi\u00e9rt \u00edgy, \u00e9s nem m\u00e1sk\u00e9pp? Azokban a szakaszokban, amelyek a tesztel\u00e9shez kapcsol\u00f3dnak, a tesztel\u0151k sz\u00e9les k\u00f6rben ismert tesztel\u00e9si piramisr\u00f3l \u00e9rtes\u00fclnek.<\/p>\n<p><img decoding=\"async\" alt=\"Integr\u00e1lja a statikus elemz\u00e9st a folyamat\u00e1ba, ne csak hib\u00e1k keres\u00e9s\u00e9re haszn\u00e1lja\" src=\"\/wp-content\/uploads\/2019\/05\/f155307fd4c1663800843c394098ea6f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Teszt piramis. Forr\u00e1s: <noindex><a rel=\"nofollow\" href=\"https:\/\/martinfowler.com\/bliki\/TestPyramid.html\">cikk<\/a><\/noindex> Martin Fowler.<\/i><\/p>\n<p>A piramis als\u00f3 r\u00e9sz\u00e9n tal\u00e1lhat\u00f3k azok a tesztek, amelyeket k\u00f6nnyebb \u00edrni, gyorsabban futnak, \u00e9s nem hajlamosak a hamis riaszt\u00e1sokra. Ez\u00e9rt ezekb\u0151l kell t\u00f6bb, nagyobb k\u00f3dot kell lefedni\u00fck, \u00e9s el\u0151sz\u00f6r kell \u0151ket v\u00e9grehajtani. A piramis fels\u0151 r\u00e9sz\u00e9n \u00e9ppen ellenkez\u0151 a helyzet, ez\u00e9rt az integr\u00e1ci\u00f3s \u00e9s UI tesztek sz\u00e1m\u00e1t minim\u00e1lisra kell cs\u00f6kkenteni. Az ember ebben a l\u00e1ncban a legdr\u00e1g\u00e1bb, leglassabb \u00e9s legmegb\u00edzhatatlanabb er\u0151forr\u00e1s, ez\u00e9rt a legv\u00e9g\u00e9re ker\u00fclt, \u00e9s csak akkor v\u00e9gez munk\u00e1t, ha az el\u0151z\u0151 szakaszok nem tal\u00e1ltak hib\u00e1t. Azonban ugyanezek az elvek \u00e9rv\u00e9nyesek a tesztel\u00e9ssel k\u00f6zvetlen\u00fcl nem kapcsolatos szakaszokban is!<\/p>\n<p>Szeretn\u00e9k egy anal\u00f3gi\u00e1t javasolni, amely egy t\u00f6bbl\u00e9pcs\u0151s v\u00edzsz\u0171r\u0151 rendszert \u00e1br\u00e1zol. A bemeneten szennyezett v\u00edz (hib\u00e1s v\u00e1ltoztat\u00e1sok) \u00e9rkezik, a kimeneten pedig tiszta vizet kell kapnunk, amelyb\u0151l minden nem k\u00edv\u00e1nt szennyez\u0151d\u00e9st kisz\u0171r\u00fcnk.<\/p>\n<p><img decoding=\"async\" alt=\"Integr\u00e1lja a statikus elemz\u00e9st a folyamat\u00e1ba, ne csak hib\u00e1k keres\u00e9s\u00e9re haszn\u00e1lja\" src=\"\/wp-content\/uploads\/2019\/05\/76b5be8f13d55c16970d67e09767a045.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>T\u00f6bbl\u00e9pcs\u0151s sz\u0171r\u0151. Forr\u00e1s: <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>Ahogy ismert, a tiszt\u00edt\u00f3 sz\u0171r\u0151ket \u00fagy tervezik, hogy minden k\u00f6vetkez\u0151 fokozat k\u00e9pes legyen egyre finomabb szennyez\u0151d\u00e9sek kisz\u0171r\u00e9s\u00e9re. A durv\u00e1bb tiszt\u00edt\u00e1ssal foglalkoz\u00f3 fokozatok nagyobb \u00e1tereszt\u0151k\u00e9pess\u00e9ggel \u00e9s alacsonyabb k\u00f6lts\u00e9ggel rendelkeznek. Anal\u00f3gi\u00e1nkban ez azt jelenti, hogy a bel\u00e9p\u00e9si min\u0151s\u00e9gi kapuk nagyobb teljes\u00edtm\u00e9nyt mutatnak, kevesebb er\u0151fesz\u00edt\u00e9st ig\u00e9nyelnek az ind\u00edt\u00e1shoz, \u00e9s maguk is kev\u00e9sb\u00e9 ig\u00e9nyesek a m\u0171k\u00f6d\u00e9s sor\u00e1n \u2014 \u00e9s pontosan ilyen sorrendben vannak fel\u00e9p\u00edtve. A statikus elemz\u00e9s szerepe, amelyr\u0151l most m\u00e1r tudjuk, hogy csak a legdurv\u00e1bb hib\u00e1kat k\u00e9pes kisz\u0171rni \u2014 ez az \u201eiszapfog\u00f3\u201d r\u00e1cs szerepe a sz\u0171r\u0151k sorozat\u00e1nak elej\u00e9n.<\/p>\n<p>A statikus elemz\u00e9s \u00f6nmag\u00e1ban nem jav\u00edtja a v\u00e9gterm\u00e9k min\u0151s\u00e9g\u00e9t, ak\u00e1rcsak az \u201eiszapfog\u00f3\u201d nem teszi iv\u00f3v\u00edzz\u00e9 a vizet. M\u00e9gis, a t\u00f6bbi elemk\u00f6zli \u00f6sszef\u00fcgg\u00e9sben nyilv\u00e1nval\u00f3 a jelent\u0151s\u00e9ge. B\u00e1r a t\u00f6bbl\u00e9pcs\u0151s sz\u0171r\u0151ben a kimeneti fokozatok potenci\u00e1lisan k\u00e9pesek ugyanezek elfog\u00e1s\u00e1ra, egy\u00e9rtelm\u0171, hogy milyen k\u00f6vetkezm\u00e9nyekkel j\u00e1r, ha csup\u00e1n a finom sz\u0171r\u00e9s l\u00e9p\u00e9seire t\u00e1maszkodunk, a bel\u00e9p\u00e9si fokozatok n\u00e9lk\u00fcl.<\/p>\n<p>Az \u201eiszapfog\u00f3\u201d c\u00e9lja, hogy tehermentes\u00edtse a k\u00f6vetkez\u0151 l\u00e9pcs\u0151ket a nagyon durva hib\u00e1k kisz\u0171r\u00e9s\u00e9t\u0151l. P\u00e9ld\u00e1ul legal\u00e1bb annyira, hogy a k\u00f3dellen\u0151rz\u00e9st v\u00e9gz\u0151 szem\u00e9lynek nem szabadna az elform\u00e1zatlan k\u00f3ddal \u00e9s a meg\u00e1llap\u00edtott k\u00f3dol\u00e1si norm\u00e1k (mint a felesleges z\u00e1r\u00f3jelek vagy t\u00fal m\u00e9ly \u00e1gaz\u00e1sok) megs\u00e9rt\u00e9s\u00e9vel foglalkoznia. Az olyan hib\u00e1knak, mint az NPE, egys\u00e9gtesztekkel kellene kisz\u0171r\u0151dnie, de ha a teszt el\u0151tt az elemz\u0151 m\u00e1r figyelmeztet minket arra, hogy hiba fog bek\u00f6vetkezni \u2014 ez jelent\u0151sen felgyors\u00edtja a jav\u00edt\u00e1st.<\/p>\n<p>Gondolom, most m\u00e1r vil\u00e1gos, mi\u00e9rt nem jav\u00edtja a term\u00e9k min\u0151s\u00e9g\u00e9t a statikus elemz\u00e9s, ha alkalomszer\u0171en alkalmazz\u00e1k, \u00e9s mi\u00e9rt kellene folyamatosan haszn\u00e1lni a durva hib\u00e1kkal kapcsolatos m\u00f3dos\u00edt\u00e1sok kisz\u0171r\u00e9s\u00e9re. A k\u00e9rd\u00e9s, hogy a statikus elemz\u0151 alkalmaz\u00e1sa jav\u00edtja-e a term\u00e9k min\u0151s\u00e9g\u00e9t, k\u00f6r\u00fclbel\u00fcl egyenl\u0151 azzal a k\u00e9rd\u00e9ssel, hogy \u201ejavulnak-e a v\u00edz iv\u00e1si tulajdons\u00e1gai, ha egy piszkos v\u00edzt\u00e1roz\u00f3b\u00f3l \u00e1tterelj\u00fck egy sz\u0171r\u0151n?\u201d<\/p>\n<h2>Bevezet\u00e9s egy \u00f6r\u00f6k\u00f6lt projekthez<\/h2>\n<p>\nFontos gyakorlati k\u00e9rd\u00e9s: hogyan lehet a statikus elemz\u00e9st be\u00e9p\u00edteni a folyamatos integr\u00e1ci\u00f3 folyamat\u00e1ba, mint \"min\u0151s\u00e9gi kaput\"? Az automatikus tesztekn\u00e9l minden egy\u00e9rtelm\u0171: van egy tesztsorozat, amelyn\u00e9l b\u00e1rmilyen hiba elegend\u0151 ahhoz, hogy azt mondjuk, a build nem teljes\u00edtette a min\u0151s\u00e9gi kaput. Az ilyen m\u00f3don a statikus elemz\u00e9s eredm\u00e9nyeivel kapcsolatos kapu be\u00e1ll\u00edt\u00e1sa azonban megbukik: a legacy k\u00f3don annyi figyelmeztet\u00e9s van, hogy azt teljesen figyelmen k\u00edv\u00fcl hagyni nem lehet, de a term\u00e9k sz\u00e1ll\u00edt\u00e1s\u00e1t sem lehet csak az\u00e9rt le\u00e1ll\u00edtani, mert figyelmeztet\u00e9sek vannak az elemz\u0151ben.<\/p>\n<p>Mivel el\u0151sz\u00f6r alkalmazva b\u00e1rmely projektben az elemz\u0151 \u00f3ri\u00e1si mennyis\u00e9g\u0171 figyelmeztet\u00e9st ad ki, amelyek t\u00falnyom\u00f3 t\u00f6bbs\u00e9ge nem kapcsol\u00f3dik a term\u00e9k megfelel\u0151 m\u0171k\u00f6d\u00e9s\u00e9hez. Az \u00f6sszes megjegyz\u00e9st egyszerre jav\u00edtani nem lehet, \u00e9s sok esetben nem is sz\u00fcks\u00e9ges. V\u00e9gs\u0151 soron tudjuk, hogy a term\u00e9k\u00fcnk \u00f6sszess\u00e9g\u00e9ben m\u0171k\u00f6dik, \u00e9s a statikus elemz\u00e9s bevezet\u00e9se el\u0151tt is!<\/p>\n<p>Ennek eredm\u00e9nyek\u00e9nt sokan az epizodikus statikus elemz\u00e9s haszn\u00e1lat\u00e1ra korl\u00e1toz\u00f3dnak, vagy csak inform\u00e1ci\u00f3s m\u00f3dban haszn\u00e1lj\u00e1k, amikor a build sor\u00e1n egyszer\u0171en kiadnak egy jelent\u00e9st az elemz\u0151t\u0151l. Ez egyen\u00e9rt\u00e9k\u0171 a teljes elemz\u00e9s hi\u00e1ny\u00e1val, mert ha m\u00e1r annyi figyelmeztet\u00e9s\u00fcnk van, akkor egy \u00faj (b\u00e1rmennyire is komoly) figyelmeztet\u00e9s a k\u00f3d m\u00f3dos\u00edt\u00e1sakor \u00e9szrev\u00e9tlen marad.<\/p>\n<p>Az al\u00e1bbi m\u00f3dszerek ismertek a min\u0151s\u00e9gi kapuk bevezet\u00e9s\u00e9re:<\/p>\n<ul>\n<li>Az \u00f6sszes figyelmeztet\u00e9s vagy a figyelmeztet\u00e9sek sz\u00e1ma \u00e9s a k\u00f3d sorainak sz\u00e1ma k\u00f6z\u00f6tti ar\u00e1ny limitj\u00e9nek be\u00e1ll\u00edt\u00e1sa. Ez rosszul m\u0171k\u00f6dik, mivel az ilyen kapu szabadon engedi a v\u00e1ltoz\u00e1sokat \u00faj hib\u00e1kkal, am\u00edg a limitet nem l\u00e9pik \u00e1t.<\/li>\n<li>A r\u00e9gi figyelmeztet\u00e9sek k\u00f3dba t\u00f6rt\u00e9n\u0151 megszor\u00edt\u00e1sa, a figyelmeztet\u00e9sek figyelmen k\u00edv\u00fcl hagy\u00e1sa egy adott pillanatban, \u00e9s az \u00faj figyelmeztet\u00e9sek megjelen\u00e9sekor a build visszautas\u00edt\u00e1sa. Ezt a funkci\u00f3t a PVS-studio \u00e9s n\u00e9h\u00e1ny online forr\u00e1s, p\u00e9ld\u00e1ul a Codacy k\u00edn\u00e1lja. Nem dolgoztam a PVS-studio-val, ami a Codacy-t illeti, a f\u0151 probl\u00e9m\u00e1juk abban rejlik, hogy nehezen meg\u00e1llap\u00edthat\u00f3, mi tekinthet\u0151 'r\u00e9gi' \u00e9s mi '\u00faj' hib\u00e1nak \u2014 ez egy meglehet\u0151sen bonyolult \u00e9s nem mindig j\u00f3l m\u0171k\u00f6d\u0151 algoritmus, k\u00fcl\u00f6n\u00f6sen akkor, ha a f\u00e1jlok jelent\u0151sen m\u00f3dosulnak vagy \u00e1tnevez\u00e9sre ker\u00fclnek. Az eml\u00e9kemben a Codacy k\u00e9pes volt kihagyni az \u00faj figyelmeztet\u00e9seket a pull requestekben, ugyanakkor nem engedte \u00e1t a pull requestet a k\u00f3d ezen v\u00e1ltoz\u00e1sainak figyelmen k\u00edv\u00fcl hagy\u00e1sa miatt.<\/li>\n<li>Szerintem a leghat\u00e9konyabb megold\u00e1s az, ami a k\u00f6nyvben szerepel. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Continuous-Delivery-Deployment-Automation-Addison-Wesley\/dp\/0321601912\">A Continuous Delivery<\/a><\/noindex> A 'h\u00e1l\u00f3zati' m\u00f3dszer ('ratcheting'). A f\u0151 \u00f6tlet az, hogy minden kiad\u00e1s saj\u00e1toss\u00e1ga a statikus elemz\u00e9s \u00e1ltal tal\u00e1lt figyelmeztet\u00e9sek mennyis\u00e9ge, \u00e9s csak olyan v\u00e1ltoztat\u00e1sok engedhet\u0151k meg, amelyek nem n\u00f6velik a figyelmeztet\u00e9sek \u00f6sszeg\u00e9t.<\/li>\n<\/ul>\n<p><\/p>\n<h2>H\u00e1l\u00f3zati<\/h2>\n<p>\nEz \u00edgy m\u0171k\u00f6dik:<\/p>\n<ol>\n<li>A kezdeti l\u00e9p\u00e9sben a kiad\u00e1s metadatumaiban r\u00f6gz\u00edtj\u00fck a k\u00f3dban tal\u00e1lhat\u00f3 figyelmeztet\u00e9sek sz\u00e1m\u00e1t, amelyeket az elemz\u0151k tal\u00e1lnak. \u00cdgy, amikor a f\u0151 branchet \u00e9p\u00edtj\u00fck, nem egyszer\u0171en '7.0.2 kiad\u00e1s', hanem '7.0.2 kiad\u00e1s, amely 100500 Checkstyle figyelmeztet\u00e9st tartalmaz' ker\u00fcl feljegyz\u00e9sre. Ha fejlett repo menedzsert haszn\u00e1l, p\u00e9ld\u00e1ul az Artifactory-t, k\u00f6nnyen meg\u0151rzi a kiad\u00e1s\u00e1hoz tartoz\u00f3 ilyen metadatokat.<\/li>\n<li>Mostant\u00f3l minden pull request buildel\u00e9se \u00f6sszehasonl\u00edtja a keletkez\u0151 figyelmeztet\u00e9sek sz\u00e1m\u00e1t a jelenlegi kiad\u00e1sban tal\u00e1lhat\u00f3 mennyis\u00e9ggel. Ha a PR ezen sz\u00e1m n\u00f6veked\u00e9s\u00e9hez vezet, a k\u00f3d nem megy \u00e1t a statikus elemz\u00e9si min\u0151s\u00e9gi kapun. Ha a figyelmeztet\u00e9sek sz\u00e1ma cs\u00f6kken vagy v\u00e1ltozatlan marad \u2014 akkor \u00e1tmegy.<\/li>\n<li>A k\u00f6vetkez\u0151 kiad\u00e1sn\u00e1l a sz\u00e1m\u00edtott figyelmeztet\u00e9sek sz\u00e1ma ism\u00e9t feljegyz\u00e9sre ker\u00fcl a kiad\u00e1s metadatumaiban.<\/li>\n<\/ol>\n<p>\n\u00cdgy, fokozatosan, de folyamatosan (mint egy ratchet m\u0171k\u00f6d\u00e9sekor), a figyelmeztet\u00e9sek sz\u00e1ma a null\u00e1hoz fog k\u00f6zel\u00edteni. Persze a rendszert meg lehet tr\u00fckk\u00f6zni, ha \u00faj figyelmeztet\u00e9st adunk hozz\u00e1, de kijav\u00edtunk egy r\u00e9git. Ez rendben van, mert hossz\u00fa t\u00e1von eredm\u00e9nyt ad: a figyelmeztet\u00e9seket \u00e1ltal\u00e1ban nem egyes\u00e9vel, hanem egy adott t\u00edpus\u00fa csoportban jav\u00edtj\u00e1k, \u00e9s az \u00f6sszes k\u00f6nnyen kijav\u00edthat\u00f3 figyelmeztet\u00e9s viszonylag gyorsan elt\u0171nik.<\/p>\n<p>Ez a grafikon azt mutatja, hogy mennyi Checkstyle figyelmeztet\u00e9s volt f\u00e9l \u00e9v alatt egy ilyen \u201eratchet\u201d m\u0171k\u00f6d\u00e9sekor <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\">az egyik OpenSource projekt\u00fcnkn\u00e9l.<\/a><\/noindex>A figyelmeztet\u00e9sek sz\u00e1ma egy nagys\u00e1grenddel cs\u00f6kkent, \u00e9s ez term\u00e9szetes m\u00f3don t\u00f6rt\u00e9nt, p\u00e1rhuzamosan a term\u00e9k fejleszt\u00e9s\u00e9vel!<\/p>\n<p><img decoding=\"async\" alt=\"Integr\u00e1lja a statikus elemz\u00e9st a folyamat\u00e1ba, ne csak hib\u00e1k keres\u00e9s\u00e9re haszn\u00e1lja\" src=\"\/wp-content\/uploads\/2019\/05\/9529bb2fb32187057088e8d2c4203333.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c9n egy m\u00f3dos\u00edtott verzi\u00f3t alkalmazok ebb\u0151l a m\u00f3dszerb\u0151l, amely k\u00fcl\u00f6n sz\u00e1molja a figyelmeztet\u00e9seket a projekt moduljainak \u00e9s elemz\u0151 eszk\u00f6zeinek bont\u00e1s\u00e1ban, a kialakul\u00f3 YAML f\u00e1jl metainform\u00e1ci\u00f3val a buildr\u0151l k\u00f6r\u00fclbel\u00fcl \u00edgy n\u00e9z ki:<\/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>\nB\u00e1rmely fejlett CI-rendszerben a \u201eratchet\u201d b\u00e1rmely statikus elemz\u0151 eszk\u00f6zre megval\u00f3s\u00edthat\u00f3, an\u00e9lk\u00fcl, hogy pluginokra vagy k\u00fcls\u0151 eszk\u00f6z\u00f6kre lenne sz\u00fcks\u00e9g. Minden elemz\u0151 a saj\u00e1t jelent\u00e9s\u00e9t adja egyszer\u0171 sz\u00f6veges vagy XML form\u00e1tumban, ami k\u00f6nnyen elemezhet\u0151. Csak a sz\u00fcks\u00e9ges logik\u00e1t kell be\u00edrni a CI-scriptbe. Megn\u00e9zheti, hogyan val\u00f3s\u00edtottuk meg ezt az open source projektjeinkben a Jenkins \u00e9s Artifactory alapjain. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/2bass\/blob\/dev\/Jenkinsfile\">itt<\/a><\/noindex> vagy <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\/blob\/dev\/Jenkinsfile\">itt<\/a><\/noindex>. Mindk\u00e9t p\u00e9lda a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/inponomarev\/ratchetlib\">ratchetlib<\/a><\/noindex>: met\u00f3dus <code>countWarnings()<\/code> a szok\u00e1sos m\u00f3don sz\u00e1molja a Checkstyle \u00e9s Spotbugs \u00e1ltal gener\u00e1lt xml-c\u00edmk\u00e9ket a f\u00e1jlokban, m\u00edg a <code>compareWarningMaps()<\/code> val\u00f3s\u00edtja meg azt a bizonyos ratchet-et, amely hiba\u00fczenetet ad, ha a figyelmeztet\u00e9sek sz\u00e1ma b\u00e1rmelyik kateg\u00f3ri\u00e1ban n\u00f6vekszik.<\/p>\n<p>\u00c9rdekes megval\u00f3s\u00edt\u00e1si lehet\u0151s\u00e9g a \u201ehamis\u00edtv\u00e1ny\u201d elemz\u00e9s\u00e9re a kommentek, sz\u00f6veges literalok \u00e9s dokument\u00e1ci\u00f3 helyes\u00edr\u00e1s\u00e1nak ellen\u0151rz\u00e9s\u00e9re az aspell seg\u00edts\u00e9g\u00e9vel. Mint tudjuk, helyes\u00edr\u00e1s-ellen\u0151rz\u00e9s sor\u00e1n nem minden ismeretlen sz\u00f3, ami a standard sz\u00f3t\u00e1rban nem szerepel, hib\u00e1s; ezek felvehet\u0151k a felhaszn\u00e1l\u00f3i sz\u00f3t\u00e1rba. Ha a felhaszn\u00e1l\u00f3i sz\u00f3t\u00e1r a projekt forr\u00e1sk\u00f3dj\u00e1nak r\u00e9sz\u00e9v\u00e9 v\u00e1lik, akkor a helyes\u00edr\u00e1si min\u0151s\u00e9gi kapu a k\u00f6vetkez\u0151k\u00e9ppen fogalmazhat\u00f3 meg: az aspell v\u00e9grehajt\u00e1sa a standard \u00e9s a felhaszn\u00e1l\u00f3i sz\u00f3t\u00e1rral. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\/blob\/271dcfc8dc3ad65ac2d1dcaa39b7fd3ea8fb5891\/Jenkinsfile#L36\">nem kellene<\/a><\/noindex> nem tal\u00e1lni helyes\u00edr\u00e1si hib\u00e1kat.<\/p>\n<h2>A verzi\u00f3elemz\u0151 r\u00f6gz\u00edt\u00e9s\u00e9nek fontoss\u00e1ga<\/h2>\n<p>\n\u00d6sszefoglalva meg kell jegyezni, hogy b\u00e1rmilyen m\u00f3don is \u00e9p\u00edti be az elemz\u00e9st a sz\u00e1ll\u00edt\u00e1si folyamat\u00e1ba, a verzi\u00f3elemz\u0151t r\u00f6gz\u00edtenie kell. Ha megengedj\u00fck a verzi\u00f3elemz\u0151 \u00f6n\u00e1ll\u00f3 friss\u00edt\u00e9s\u00e9t, akkor a k\u00f6vetkez\u0151 pull request \u00f6ssze\u00e1ll\u00edt\u00e1sakor \u00faj hib\u00e1k \u201ebukkanhatnak fel\u201d, amelyek nem kapcsol\u00f3dnak a k\u00f3d v\u00e1ltoz\u00e1saihoz, hanem ahhoz, hogy az \u00faj elemz\u0151 egyszer\u0171en k\u00e9pes t\u00f6bb hib\u00e1t tal\u00e1lni \u2014 ez pedig megnehez\u00edti a pull requestek \u00e1tv\u00e9tel\u00e9nek folyamat\u00e1t. Az elemz\u0151 friss\u00edt\u00e9se tudatos l\u00e9p\u00e9s kell, hogy legyen. Egy\u00e9bk\u00e9nt az \u00f6sszes \u00e9p\u00edt\u0151elem verzi\u00f3j\u00e1nak szigor\u00fa r\u00f6gz\u00edt\u00e9se \u00e1ltal\u00e1ban sz\u00fcks\u00e9ges k\u00f6vetelm\u00e9ny, \u00e9s k\u00fcl\u00f6n besz\u00e9lget\u00e9s t\u00e9m\u00e1ja.<\/p>\n<h2>K\u00f6vetkeztet\u00e9sek<\/h2>\n<p><\/p>\n<ul>\n<li>A statikus elemz\u00e9s nem fog hib\u00e1kat tal\u00e1lni, \u00e9s nem jav\u00edtja a term\u00e9ke min\u0151s\u00e9g\u00e9t egyetlen alkalmaz\u00e1s eredm\u00e9nyek\u00e9nt. Csak a folyamatos alkalmaz\u00e1s\u00e1nak van pozit\u00edv hat\u00e1sa a min\u0151s\u00e9gre a sz\u00e1ll\u00edt\u00e1si folyamat sor\u00e1n.<\/li>\n<li>A hib\u00e1k keres\u00e9se egy\u00e1ltal\u00e1n nem a legf\u0151bb c\u00e9lja az elemz\u00e9snek; a hasznos funkci\u00f3k t\u00f6bbs\u00e9ge el\u00e9rhet\u0151 opensource eszk\u00f6z\u00f6kben.<\/li>\n<li>Alkalmazza a statikus anal\u00edzis eredm\u00e9nyein alapul\u00f3 min\u0151s\u00e9gi kapukat a sz\u00e1ll\u00edt\u00e1si folyamat legels\u0151 szakasz\u00e1ban, haszn\u00e1lja a \u201ehamis\u00edtv\u00e1nyt\u201d a legacy k\u00f3dra.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Hivatkoz\u00e1sok<\/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\">A Continuous Delivery<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=8Cx3LHNjI24\">A. Kudrjavcev: Programelemz\u00e9s: hogyan \u00e9rthetj\u00fck meg, hogy j\u00f3 programoz\u00f3k vagyunk<\/a><\/noindex> el\u0151ad\u00e1s a k\u00fcl\u00f6nb\u00f6z\u0151 k\u00f3d-elemz\u00e9si m\u00f3dszerekr\u0151l (nemcsak statikus!)<\/li>\n<\/ol>\n<p>Forr\u00e1s: <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.3 - 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\/hu\/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.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\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\/hu\/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\udd47 Alkalmazza a statikus elemz\u00e9st a folyamatban, ne hib\u00e1kat keresve a seg\u00edts\u00e9g\u00e9vel | ProHoster","description":"Ez a cikk meg\u00edr\u00e1s\u00e1ra egy nagy mennyis\u00e9g\u0171 anyag \u00f6szt\u00f6nz\u00f6tt a statikus elemz\u00e9ssel kapcsolatban, amely egyre gyakrabban t\u0171nik fel el\u0151ttem.","canonical_url":"https:\/\/prohoster.info\/hu\/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":"hu_HU","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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/32848","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=32848"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/32848\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/24622"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=32848"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=32848"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=32848"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}