{"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\/de\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","title":{"rendered":"Integrieren Sie statische Analyse in den Prozess, anstatt sie zur Fehlersuche zu verwenden.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Der Ansto\u00df zum Verfassen dieses Artikels war die zunehmende Anzahl von Materialien \u00fcber statische Analysen, die mir immer h\u00e4ufiger begegneten. Erstens handelt es sich um den <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/\">PVS-Studio Blog<\/a><\/noindex>, der sich aktiv auf Habr mit Berichten \u00fcber Fehler pr\u00e4sentiert, die mit ihrem Tool in Open-Source-Projekten gefunden wurden. K\u00fcrzlich hat PVS-Studio <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/436496\/\">Java-Unterst\u00fctzung<\/a><\/noindex>implementiert und nat\u00fcrlich konnten die Entwickler von IntelliJ IDEA, deren integrierter Analysator heute vielleicht der fortschrittlichste f\u00fcr Java ist, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/JetBrains\/blog\/436278\/\">nicht unt\u00e4tig bleiben.<\/a><\/noindex>. <\/p>\n<p>Beim Lesen solcher Berichte hat man das Gef\u00fchl, es ginge um einen magischen Zaubertrank: Dr\u00fccke einen Knopf und voil\u00e0 \u2013 eine Liste von Defekten erscheint vor deinen Augen. Es scheint, dass mit der Weiterentwicklung der Analysatoren immer mehr Fehler automatisch gefunden werden, und die Produkte, die von diesen Tools scannen, immer besser werden, ohne dass wir daf\u00fcr irgendwelche Anstrengungen aufbringen m\u00fcssen.<\/p>\n<p>Aber magische Zaubertr\u00e4nke gibt es nicht. Ich m\u00f6chte dar\u00fcber sprechen, was in Beitr\u00e4gen wie \u201eDas kann unser Roboter finden\u201c normalerweise nicht erw\u00e4hnt wird: Was Analysatoren nicht k\u00f6nnen, welche ihre tats\u00e4chliche Rolle und ihren Platz im Softwarebereitstellungsprozess ist und wie man sie richtig implementiert.<\/p>\n<p><img decoding=\"async\" alt=\"Integrieren Sie statische Analyse in den Prozess, anstatt sie zur Fehlersuche zu verwenden.\" src=\"\/wp-content\/uploads\/2019\/05\/2a0339f10edcaed3310676ab6e2f975a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Kratzer (Quelle: <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>Was statische Analysatoren nie leisten k\u00f6nnen<\/h2>\n<p>\nWas bedeutet es aus praktischer Sicht, Quellcode zu analysieren? Wir geben einige Quellcodes ein und erhalten in kurzer Zeit (deutlich k\u00fcrzer als bei Testl\u00e4ufen) bestimmte Informationen \u00fcber unser System. Eine grundlegende und mathematisch un\u00fcberwindbare Einschr\u00e4nkung besteht darin, dass wir auf diese Weise nur eine relativ enge Klasse von Informationen erhalten k\u00f6nnen.<\/p>\n<p>Das bekannteste Beispiel f\u00fcr ein Problem, das mit statischer Analyse nicht gel\u00f6st werden kann \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Halting_problem\">das Halteproblem<\/a><\/noindex>: Dies ist ein Theorem, das beweist, dass es unm\u00f6glich ist, einen allgemeinen Algorithmus zu entwickeln, der anhand des Quellcodes eines Programms bestimmt, ob es sich in eine Endlosschleife begibt oder in endlicher Zeit endet. Eine Erweiterung dieses Theorems ist <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Rice%27s_theorem\">das Rice-Theorem<\/a><\/noindex>, die besagt, dass die Bestimmung, ob ein beliebiges Programm eine Funktion mit einem nichttrivialen Eigenschaften berechnet, algorithmisch unl\u00f6sbar ist. Zum Beispiel ist es unm\u00f6glich, einen Analyzer zu schreiben, der f\u00fcr jeden Quellcode bestimmt, ob das analysierte Programm eine Implementierung eines Algorithmus ist, der beispielsweise eine Ganzzahl quadriert.<\/p>\n<p>Daher hat die Funktionalit\u00e4t statischer Analyzer un\u00fcberwindbare Einschr\u00e4nkungen. Ein statischer Analyzer kann niemals in allen F\u00e4llen Dinge wie das Auftreten einer \u201eNull-Pointer-Exception\u201c in Sprachen, die null zulassen, oder das Auftreten von \u201eAttribut nicht gefunden\u201c in dynamisch typisierten Sprachen bestimmen. Alles, was der perfekteste statische Analyzer kann, ist, spezielle F\u00e4lle hervorzuheben, deren Anzahl im Vergleich zu allen m\u00f6glichen Problemen mit Ihrem Quellcode, gelinde gesagt, ein Tropfen auf den hei\u00dfen Stein ist.<\/p>\n<h2>Statische Analyse ist nicht die Suche nach Bugs<\/h2>\n<p>\nAus dem Vorstehenden l\u00e4sst sich folgern: statische Analyse ist kein Mittel zur Verringerung der Anzahl von Fehlern im Programm. Ich wage zu behaupten: Wenn sie erstmals auf Ihr Projekt angewendet wird, wird sie in Ihrem Code \"interessante\" Stellen finden, aber wahrscheinlich keine Fehler, die die Qualit\u00e4t Ihrer Anwendung beeintr\u00e4chtigen.<\/p>\n<p>Die Beispiele f\u00fcr Fehler, die von Analysewerkzeugen automatisch gefunden wurden, sind beeindruckend, aber man sollte nicht vergessen, dass diese Beispiele durch das Scannen gro\u00dfer Mengen umfangreicher Codebasen gefunden wurden. Nach dem gleichen Prinzip finden Hacker, die in der Lage sind, mehrere einfache Passw\u00f6rter auf einer Vielzahl von Konten zu testen, letztendlich die Konten, die ein einfaches Passwort verwenden.<\/p>\n<p>Bedeutet das, dass statische Analyse nicht angewendet werden sollte? Nat\u00fcrlich nicht! Und genau aus dem gleichen Grund, aus dem jedes neue Passwort auf seine Zugeh\u00f6rigkeit zur Liste \"einfacher\" Passw\u00f6rter \u00fcberpr\u00fcft werden sollte.<\/p>\n<h2>Statische Analyse ist mehr als nur Fehlersuche.<\/h2>\n<p>\nIn der Tat sind die durch Analysen l\u00f6sbaren Aufgaben viel umfassender. Grunds\u00e4tzlich ist eine statische Analyse jede \u00dcberpr\u00fcfung des Quellcodes, die vor seiner Ausf\u00fchrung stattfindet. Hier sind einige Dinge, die man tun kann:<\/p>\n<ul>\n<li> \u00dcberpr\u00fcfung des Codestils im weitesten Sinne. Dies umfasst sowohl die Formatierung als auch die Suche nach leeren oder \u00fcberfl\u00fcssigen Klammern, die Festlegung von Schwellenwerten f\u00fcr Metriken wie die Anzahl der Zeilen oder die zyklomatische Komplexit\u00e4t einer Methode usw. \u2014 alles, was die Lesbarkeit und Wartbarkeit des Codes potenziell erschwert. In Java ist ein solches Tool Checkstyle, in Python flake8. Programme dieser Art werden \u00fcblicherweise als 'Linter' bezeichnet.<\/li>\n<li>Nicht nur der ausf\u00fchrbare Code kann analysiert werden. Ressourcen-Dateien wie JSON, YAML, XML, .properties sollten (und m\u00fcssen!) automatisch auf Validit\u00e4t gepr\u00fcft werden. Es ist besser, fr\u00fchzeitig bei der automatischen \u00dcberpr\u00fcfung eines Pull Requests zu erfahren, dass die Struktur von JSON aufgrund ungerader Anf\u00fchrungszeichen verletzt wurde, als beim Ausf\u00fchren von Tests oder zur Laufzeit. Entsprechende Werkzeuge sind vorhanden: Zum Beispiel <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> Die Kompilierung (oder das Parsen f\u00fcr dynamische Programmiersprachen) ist ebenfalls eine Form der statischen Analyse. In der Regel sind Compiler in der Lage, Warnungen auszugeben, die auf Probleme mit der Qualit\u00e4t des Quellcodes hinweisen, und diese sollten nicht ignoriert werden.<\/li>\n<li>Manchmal ist die Kompilierung nicht nur die Erstellung ausf\u00fchrbaren Codes. Wenn Sie beispielsweise Dokumentation im Format <noindex><a rel=\"nofollow\" href=\"https:\/\/asciidoctor.org\/\">AsciiDoctor<\/a><\/noindex>, haben, kann der AsciiDoctor-Prozessor (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/asciidoctor\/asciidoctor-maven-plugin\">Maven-Plugin<\/a><\/noindex>) beim Umwandeln in HTML\/PDF Warnungen ausgeben, etwa zu verletzten internen Links. Das ist ein legitimer Grund, einen Pull Request mit \u00c4nderungen an der Dokumentation abzulehnen.<\/li>\n<li>Die Rechtschreibpr\u00fcfung ist ebenfalls eine Form der statischen Analyse. Das Tool <noindex><a rel=\"nofollow\" href=\"http:\/\/aspell.net\/\">aspell<\/a><\/noindex> kann die Rechtschreibung nicht nur in der Dokumentation, sondern auch im Quellcode von Programmen (Kommentaren und Literalen) in verschiedenen Programmiersprachen wie C\/C++, Java und Python \u00fcberpr\u00fcfen. Ein Rechtschreibfehler in der Benutzeroberfl\u00e4che oder in der Dokumentation ist ebenfalls ein Mangel!<\/li>\n<li>Konfigurationstests (was das ist, siehe <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=KaeEjsAjV6A&amp;index=30&amp;list=PLsVTVVvrKX9tuYyCtL8mASB6IOaa-kRCA&amp;t=0s\">diese<\/a><\/noindex> und <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=Tk_nmV-mWOA\">diese<\/a><\/noindex> Berichte, obwohl sie in der Ausf\u00fchrungsumgebung von Modultests wie pytest durchgef\u00fchrt werden, sind tats\u00e4chlich eine Form der statischen Analyse, da sie den Quellcode w\u00e4hrend ihrer Ausf\u00fchrung nicht ausf\u00fchren.<\/li>\n<\/ul>\n<p>\nWie wir sehen, spielt das Finden von Bugs in dieser Liste die unwichtigste Rolle, w\u00e4hrend alles andere \u00fcber die Nutzung kostenloser Open-Source-Tools zug\u00e4nglich ist.<\/p>\n<p>Welche dieser Arten von statischer Analyse sollten Sie in Ihrem Projekt anwenden? Nat\u00fcrlich alle, je mehr, desto besser! Es ist wichtig, dass Sie dies richtig implementieren, wor\u00fcber wir sp\u00e4ter sprechen werden.<\/p>\n<h2>Die Lieferpipeline als mehrstufiger Filter und die statische Analyse als ihr erster Sprung.<\/h2>\n<p>\nEine klassische Metapher f\u00fcr kontinuierliche Integration ist die Pipeline, durch die \u00c4nderungen flie\u00dfen \u2013 vom \u00c4nderungen des Quellcodes bis zur Bereitstellung in der Produktion. Die Standardabfolge der Schritte in dieser Pipeline sieht folgenderma\u00dfen aus:<\/p>\n<ol>\n<li>statische Analyse<\/li>\n<li>Kompilierung<\/li>\n<li>Modultests<\/li>\n<li>Integrationstests<\/li>\n<li>UI-Tests<\/li>\n<li>manuelle \u00dcberpr\u00fcfung<\/li>\n<\/ol>\n<p>\n\u00c4nderungen, die in der N-ten Phase der Pipeline abgelehnt werden, gelangen nicht zur Phase N+1.<\/p>\n<p>Warum ist das so und nicht anders? Im Teil des Prozesses, der das Testing betrifft, lernen Tester die weit verbreitete Testpyramide kennen.<\/p>\n<p><img decoding=\"async\" alt=\"Integrieren Sie statische Analyse in den Prozess, anstatt sie zur Fehlersuche zu verwenden.\" src=\"\/wp-content\/uploads\/2019\/05\/f155307fd4c1663800843c394098ea6f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Testpyramide. Quelle: <noindex><a rel=\"nofollow\" href=\"https:\/\/martinfowler.com\/bliki\/TestPyramid.html\">Artikel<\/a><\/noindex> Martin Fowler.<\/i><\/p>\n<p>In der unteren H\u00e4lfte dieser Pyramide befinden sich Tests, die leichter zu schreiben sind, schneller ausgef\u00fchrt werden k\u00f6nnen und weniger anf\u00e4llig f\u00fcr Fehlalarme sind. Daher sollte es mehr von ihnen geben, sie sollten mehr Code abdecken und zuerst ausgef\u00fchrt werden. In der oberen H\u00e4lfte der Pyramide ist es genau umgekehrt, weshalb die Anzahl der Integrations- und UI-Tests auf das notwendige Minimum reduziert werden sollte. Der Mensch in dieser Kette ist die teuerste, langsamste und unzuverl\u00e4ssigste Ressource, weshalb er am Ende angestellt wird und nur dann arbeitet, wenn die vorherigen Schritte keine M\u00e4ngel entdeckt haben. Doch nach denselben Prinzipien wird auch der Prozess in Bereichen aufgebaut, die nicht direkt mit dem Testing verbunden sind!<\/p>\n<p>Ich m\u00f6chte eine Analogie in Form eines mehrstufigen Wasserfilters vorschlagen. Im Eingangsbereich wird schmutziges Wasser (\u00c4nderungen mit M\u00e4ngeln) eingespeist, und am Ausgang sollten wir reines Wasser erhalten, aus dem alle unerw\u00fcnschten Verunreinigungen herausgefiltert sind.<\/p>\n<p><img decoding=\"async\" alt=\"Integrieren Sie statische Analyse in den Prozess, anstatt sie zur Fehlersuche zu verwenden.\" src=\"\/wp-content\/uploads\/2019\/05\/76b5be8f13d55c16970d67e09767a045.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Mehrstufiger Filter. Quelle: <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>Wie bekannt, sind Reinigungssysteme so konzipiert, dass jede nachfolgende Stufe immer feinere Fraktionen von Verunreinigungen herausfiltern kann. Dabei haben die groben Filterstufen eine h\u00f6here Durchflussrate und niedrigere Kosten. In unserer Analogie bedeutet das, dass die eingehenden Qualit\u00e4tspunkte eine h\u00f6here Leistungsf\u00e4higkeit aufweisen, weniger Aufwand f\u00fcr den Betrieb ben\u00f6tigen und selbst in der Handhabung unkomplizierter sind \u2013 und genau in dieser Reihenfolge sind sie aufgebaut. Die Rolle der statischen Analyse, die, wie wir jetzt verstehen, lediglich die grobsten M\u00e4ngel herausfiltern kann, entspricht der Funktion eines \u201eSchmutzgitters\u201c zu Beginn der Filterstufen.<\/p>\n<p>Statische Analysen allein verbessern nicht die Qualit\u00e4t des Endprodukts, ebenso wie ein Grobfilter Wasser nicht trinkbar macht. Dennoch ist ihre Bedeutung im Zusammenspiel mit anderen Elementen des Prozesses offensichtlich. Obwohl in einem mehrstufigen Filter die Ausgangsstufen theoretisch alles fangen k\u00f6nnen, was auch die Eingangs-stufen erfassen, sind die Konsequenzen einer ausschlie\u00dflichen Abh\u00e4ngigkeit von nur feinen Filter-stufen ohne Eingangs-stufen klar.<\/p>\n<p>Das Ziel eines Grobfilters ist es, die nachfolgenden Stufen von der Erfassung wirklich grober Fehler zu entlasten. Zum Beispiel sollte jemand, der eine Code-\u00dcberpr\u00fcfung durchf\u00fchrt, nicht durch schlecht formatierten Code oder Verst\u00f6\u00dfe gegen die festgelegten Codierungsstandards (wie \u00fcberfl\u00fcssige Klammern oder zu tief verschachtelte Verzweigungen) abgelenkt werden. Bugs wie NPE sollten durch Modultests erfasst werden, aber wenn der Analysator bereits vor dem Test darauf hinweist, dass der Bug unvermeidlich ist \u2013 beschleunigt das erheblich dessen Behebung.<\/p>\n<p>Es sollte nun klar sein, warum statische Analysen die Produktqualit\u00e4t nicht verbessern, wenn sie sporadisch angewendet werden. Sie m\u00fcssen kontinuierlich eingesetzt werden, um \u00c4nderungen mit groben Fehlern auszusondern. Die Frage, ob der Einsatz eines statischen Analysetools die Qualit\u00e4t Ihres Produkts verbessert, ist in etwa so sinnvoll wie die Frage: \u201eWird sich die Trinkqualit\u00e4t von Wasser aus einem schmutzigen Teich verbessern, wenn man es durch ein Sieb gie\u00dfen?\u201c<\/p>\n<h2>Integration in ein Legacy-Projekt<\/h2>\n<p>\nEine wichtige praktische Frage: Wie integrieren wir statische Analysen in den kontinuierlichen Integrationsprozess als \u201eQualit\u00e4tscheck\u201c? Bei automatisierten Tests ist alles klar: Es gibt eine Reihe von Tests, und das Scheitern eines dieser Tests reicht aus, um zu sagen, dass der Build den Qualit\u00e4tscheck nicht bestanden hat. Der Versuch, einen Qualit\u00e4tscheck anhand der Ergebnisse der statischen Analyse einzuf\u00fchren, scheitert: Bei Legacy-Code gibt es zu viele Warnungen aus der Analyse. Man m\u00f6chte sie nicht vollst\u00e4ndig ignorieren, aber die Produktbereitstellung nur aufgrund von Warnungen des Analysetools zu stoppen, ist ebenfalls nicht m\u00f6glich.<\/p>\n<p>Bei der ersten Anwendung zeigt der Analyzer eine enorme Anzahl von Warnungen an, von denen die \u00fcberwiegende Mehrheit nicht mit der ordnungsgem\u00e4\u00dfen Funktion des Produkts zusammenh\u00e4ngt. Es ist unm\u00f6glich, all diese Anmerkungen sofort zu beheben, und viele sind es auch nicht wert. Schlie\u00dflich wissen wir, dass unser Produkt insgesamt funktioniert, und das sogar vor der Einf\u00fchrung der statischen Analyse!<\/p>\n<p>Infolgedessen beschr\u00e4nken sich viele auf eine sporadische Nutzung der statischen Analyse oder verwenden sie lediglich im Informationsmodus, bei dem beim Zusammenbau einfach ein Bericht des Analyzers ausgegeben wird. Das ist gleichbedeutend mit dem Fehlen jeglicher Analyse, denn wenn wir bereits zahlreiche Warnungen haben, bleibt das Auftreten einer weiteren (wie auch immer schwerwiegenden) \u00c4nderung im Code unbemerkt.<\/p>\n<p>Die folgenden Methoden zur Einf\u00fchrung von Quality Gates sind bekannt:<\/p>\n<ul>\n<li>Setzen eines Limits f\u00fcr die Gesamtzahl der Warnungen oder der Anzahl der Warnungen im Verh\u00e4ltnis zur Anzahl der Codezeilen. Das funktioniert schlecht, da ein solches Gate Ver\u00e4nderungen mit neuen Defekten ohne weiteres durchl\u00e4sst, solange das Limit nicht \u00fcberschritten wird.<\/li>\n<li>Die Fixierung aller alten Warnungen im Code zu einem bestimmten Zeitpunkt als ignoriert und das Abbrechen der Build-Prozesse bei neuen Warnungen. Diese Funktionalit\u00e4t bietet PVS-Studio und einige Online-Dienste wie Codacy an. Ich hatte noch nicht die Gelegenheit, mit PVS-Studio zu arbeiten, aber meiner Erfahrung mit Codacy nach, besteht ihr gr\u00f6\u00dftes Problem darin, dass die Erkennung, was als \"alte\" und was als \"neue\" Fehlermeldung gilt, ein recht komplexer und nicht immer korrekt funktionierender Algorithmus ist, besonders wenn Dateien stark ver\u00e4ndert oder umbenannt werden. Soweit ich mich erinnere, konnte Codacy in Pull-Requests neue Warnungen \u00fcbersehen und gleichzeitig einen Pull-Request aufgrund von Warnungen ablehnen, die sich nicht auf die \u00c4nderungen im Code dieses PR bezogen.<\/li>\n<li>Meiner Meinung nach ist die effektivste L\u00f6sung die in dem Buch beschriebene <noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Continuous-Delivery-Deployment-Automation-Addison-Wesley\/dp\/0321601912\">Continuous Delivery<\/a><\/noindex> \u201eRatschenmethode\u201c (\u201eratcheting\u201c). Die Hauptidee besteht darin, dass jede Version eine bestimmte Anzahl statischer Analysewarnungen aufweist und nur solche \u00c4nderungen zul\u00e4ssig sind, die die Gesamtanzahl der Warnungen nicht erh\u00f6hen.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Ratsche<\/h2>\n<p>\nDas funktioniert folgenderma\u00dfen:<\/p>\n<ol>\n<li>In der ersten Phase werden Metadaten \u00fcber die Anzahl der im Code gefundenen Warnungen, die von den Analysewerkzeugen erkannt wurden, erfasst. So wird beim Build des Hauptzweigs in Ihrem Repository-Manager nicht nur \"Release 7.0.2\" aufgezeichnet, sondern \"Release 7.0.2, das 100500 Checkstyle-Warnungen enth\u00e4lt\". Wenn Sie einen fortschrittlichen Repository-Manager verwenden (wie Artifactory), ist es einfach, solche Metadaten \u00fcber Ihr Release zu speichern.<\/li>\n<li>Jetzt vergleicht jeder Pull Request beim Build die Anzahl der hervorgebrachten Warnungen mit der Anzahl, die im aktuellen Release vorhanden ist. Wenn der PR zu einer Erh\u00f6hung dieser Zahl f\u00fchrt, besteht der Code den Quality Gate des statischen Codes nicht. Wenn die Anzahl der Warnungen sinkt oder gleich bleibt, wird er akzeptiert.<\/li>\n<li>Beim n\u00e4chsten Release wird die neu berechnete Anzahl der Warnungen erneut in den Release-Metadaten festgehalten.<\/li>\n<\/ol>\n<p>\nSo geht es Schritt f\u00fcr Schritt voran (wie bei der Arbeit mit einem Kranz), die Anzahl der Warnungen wird gegen Null tendieren. Nat\u00fcrlich kann man das System t\u00e4uschen, indem man eine neue Warnung einf\u00fcgt und dabei eine andere korrigiert. Das ist in Ordnung, denn auf lange Sicht erzielt es Ergebnisse: Warnungen werden in der Regel nicht einzeln, sondern in Gruppen eines bestimmten Typs behoben, und alle leicht behebbaren Warnungen sind recht schnell beseitigt.<\/p>\n<p>In diesem Diagramm ist die Gesamtzahl der Checkstyle-Warnungen \u00fcber ein halbes Jahr der Arbeit eines solchen \"Kranzes\" an <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\">einem unserer OpenSource-Projekte<\/a><\/noindex>. Die Anzahl der Warnungen hat sich um eine Gr\u00f6\u00dfenordnung reduziert, und das geschah ganz nat\u00fcrlich, parallel zur Produktentwicklung!<\/p>\n<p><img decoding=\"async\" alt=\"Integrieren Sie statische Analyse in den Prozess, anstatt sie zur Fehlersuche zu verwenden.\" src=\"\/wp-content\/uploads\/2019\/05\/9529bb2fb32187057088e8d2c4203333.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIch verwende eine modifizierte Version dieser Methode und z\u00e4hle die Warnungen separat nach Modulen des Projekts und Analysetools. Die dabei generierte YAML-Datei mit Metadaten \u00fcber den Build sieht etwa so aus:<\/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>\nIn jedem fortschrittlichen CI-System kann ein \u201eRatschen\u201c f\u00fcr alle Werkzeuge der statischen Analyse implementiert werden, ohne auf Plugins oder externe Tools angewiesen zu sein. Jeder Analyzer gibt seinen Bericht in einem einfachen Text- oder XML-Format aus, das leicht analysiert werden kann. Es bleibt nur die notwendige Logik im CI-Skript zu schreiben. Sie k\u00f6nnen sehen, wie dies in unseren Open-Source-Projekten auf Basis von Jenkins und Artifactory umgesetzt ist. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/2bass\/blob\/dev\/Jenkinsfile\">hier<\/a><\/noindex> oder <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\/blob\/dev\/Jenkinsfile\">hier<\/a><\/noindex>. Beide Beispiele h\u00e4ngen von der Bibliothek <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/inponomarev\/ratchetlib\">ratchetlib<\/a><\/noindex>: die Methode <code>countWarnings()<\/code> z\u00e4hlt ganz normal die XML-Tags in den von Checkstyle und Spotbugs erstellten Dateien, w\u00e4hrend <code>compareWarningMaps()<\/code> das eigentliche Ratschen implementiert, indem es einen Fehler ausgibt, wenn die Anzahl der Warnungen in einer der Kategorien steigt.<\/p>\n<p>Eine interessante M\u00f6glichkeit zur Implementierung eines \"Ratschenmechanismus\" besteht darin, die Rechtschreibung von Kommentaren, Textliteralen und Dokumentationen mithilfe von aspell zu analysieren. Wie bekannt ist, sind nicht alle W\u00f6rter, die dem Standardw\u00f6rterbuch unbekannt sind, falsch; sie k\u00f6nnen in ein Benutzerw\u00f6rterbuch aufgenommen werden. Wenn das Benutzerw\u00f6rterbuch Teil des Quellcodes des Projekts wird, k\u00f6nnte das Qualit\u00e4tssicherungssystem f\u00fcr die Rechtschreibung wie folgt formuliert werden: Ausf\u00fchrung von aspell mit dem Standard- und Benutzerw\u00f6rterbuch. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\/blob\/271dcfc8dc3ad65ac2d1dcaa39b7fd3ea8fb5891\/Jenkinsfile#L36\">darf nicht<\/a><\/noindex> keine Rechtschreibfehler finden.<\/p>\n<h2>\u00dcber die Wichtigkeit der Versionierung des Analysetools<\/h2>\n<p>\nZusammenfassend l\u00e4sst sich sagen: Unabh\u00e4ngig davon, wie Sie die Analyse in Ihre Bereitstellungspipeline integrieren, muss die Version des Analysetools festgelegt sein. Wenn das Analysetool unkontrolliert aktualisiert wird, k\u00f6nnen beim Zusammenstellen eines Pull-Requests neue Fehler auftauchen, die nicht mit dem Codewechsel zusammenh\u00e4ngen, sondern damit, dass das neue Analysetool einfach in der Lage ist, mehr Fehler zu erkennen \u2013 und das kann Ihren Pr\u00fcfprozess f\u00fcr Pull-Requests st\u00f6ren. Ein Upgrade des Analysetools sollte eine bewusste Entscheidung sein. Eine strikte Festlegung der Version jedes Bestandteils der Assembly ist im Allgemeinen erforderlich und ein Thema f\u00fcr sich.<\/p>\n<h2>Fazit<\/h2>\n<p><\/p>\n<ul>\n<li>Statische Analysen finden keine Bugs und verbessern die Qualit\u00e4t Ihres Produkts nicht durch eine einmalige Anwendung. Ein positiver Effekt auf die Qualit\u00e4t ergibt sich nur durch die kontinuierliche Anwendung im Bereitstellungsprozess.<\/li>\n<li>Die Fehlersuche ist \u00fcberhaupt nicht das Hauptziel der Analyse; die \u00fcberwiegende Mehrheit der n\u00fctzlichen Funktionen ist in Open-Source-Tools verf\u00fcgbar.<\/li>\n<li>Implementieren Sie Quality Gates basierend auf den Ergebnissen der statischen Analyse bereits in der ersten Phase der Bereitstellungspipeline und nutzen Sie dabei einen \u201eZahnradmechanismus\u201c f\u00fcr Legacy-Code.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Links<\/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\">Continuous Delivery<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=8Cx3LHNjI24\">A. Kudryavtsev: Analyse von Programmen: Wie erkennt man, dass man ein guter Programmierer ist<\/a><\/noindex> Vortrag \u00fcber verschiedene Methoden der Code-Analyse (nicht nur statische!)<\/li>\n<\/ol>\n<p>Quelle: <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 4.9.10 - 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\/de\/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) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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\udd47Integrieren Sie die statische Analyse in Ihren Prozess, anstatt mit ihr nach Bugs zu suchen | ProHoster","description":"Inspiration f\u00fcr diesen Artikel gab mir die Vielzahl an Materialien \u00fcber statische Analysen, die immer h\u00e4ufiger ins Blickfeld geraten. An erster Stelle steht der Blog von PVS-studio, der sich aktiv auf Habr f\u00f6rdert, indem er Fehlerberichte ver\u00f6ffentlicht, die mit Hilfe ihres Tools in Open-Source-Projekten gefunden wurden. K\u00fcrzlich hat PVS-studio die Unterst\u00fctzung f\u00fcr Java implementiert, und nat\u00fcrlich haben die Entwickler von IntelliJ IDEA, deren integrierter Analysator mittlerweile sicherlich,","canonical_url":"https:\/\/prohoster.info\/de\/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":"de_DE","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\/de\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/32848","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=32848"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/32848\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/24622"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=32848"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=32848"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=32848"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}