{"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 die statische Analyse in den Prozess und suchen Sie nicht mit ihrer Hilfe nach Bugs.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Die gro\u00dfe Menge an Materialien \u00fcber statische Analyse, die mir st\u00e4ndig ins Auge fallen, hat mich dazu inspiriert, diesen Artikel zu schreiben. Erstens ist das <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/\">PVS-studio Blog<\/a><\/noindex>, der sich aktiv auf Habrahabr mit Hilfe von Berichten \u00fcber Fehler, die mit ihrem Werkzeug in Open-Source-Projekten gefunden wurden, pr\u00e4sentiert. K\u00fcrzlich haben die PVS-studio <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/436496\/\">Unterst\u00fctzung f\u00fcr Java<\/a><\/noindex>realisiert, und nat\u00fcrlich konnten die Entwickler von IntelliJ IDEA, deren integrierter Analyzer wahrscheinlich der fortschrittlichste f\u00fcr Java ist, nicht abseits stehen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/JetBrains\/blog\/436278\/\">Wenn man solche Berichte liest, hat man das Gef\u00fchl, es gehe um einen Zaubertrank: Dr\u00fccke einen Knopf, und voil\u00e0 \u2013 eine Liste von Defekten steht vor dir. Es scheint, dass mit der Verbesserung der Analyzer immer mehr Bugs automatisch gefunden werden, und die Produkte, die von diesen Robotern gescannt werden, werden immer besser, ganz ohne M\u00fche unsererseits.<\/a><\/noindex>. <\/p>\n<p>Aber Zaubertr\u00e4nke gibt es nicht. Ich m\u00f6chte \u00fcber das sprechen, was in Beitr\u00e4gen wie \u201ewas unser Roboter finden kann\u201c normalerweise nicht erw\u00e4hnt wird: was Analyzer nicht k\u00f6nnen, welche Rolle und welchen Platz sie im Software-Lieferprozess haben und wie man sie richtig implementiert.<\/p>\n<p>Eine der Herausforderungen (Quelle:<\/p>\n<p><img decoding=\"async\" alt=\"Integrieren Sie die statische Analyse in den Prozess und suchen Sie nicht mit ihrer Hilfe nach Bugs.\" src=\"\/wp-content\/uploads\/2019\/05\/2a0339f10edcaed3310676ab6e2f975a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Wikipedia <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\">Was statische Analyzer niemals k\u00f6nnen werden<\/a><\/noindex>).<\/i><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Was ist aus praktischer Sicht die Analyse von Quellcode? Wir reichen einige Quellcodes ein, und nach kurzer Zeit (deutlich k\u00fcrzer als die Durchf\u00fchrung von Tests) erhalten wir einige 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.<\/h2>\n<p>\nDas bekannteste Beispiel f\u00fcr ein Problem, das mit statischer Analyse nicht gel\u00f6st werden kann, ist die<\/p>\n<p>Haltbarkeit der Berechnung <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Halting_problem\">: Es handelt sich um einen Satz, der beweist, dass es unm\u00f6glich ist, einen allgemeinen Algorithmus zu entwickeln, der aufgrund des Quellcodes eines Programms feststellen kann, ob es in eine Endlosschleife ger\u00e4t oder innerhalb einer endlichen Zeit beendet wird. Eine Erweiterung dieses Satzes ist die<\/a><\/noindex>Rais-Satz <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Rice%27s_theorem\">Rais-Theorem<\/a><\/noindex>, die f\u00fcr jede nicht-triviale Eigenschaft berechenbarer Funktionen die Bestimmung, ob ein beliebiges Programm eine Funktion mit dieser Eigenschaft berechnet, eine algorithmisch unl\u00f6sbare Aufgabe ist. Zum Beispiel ist es unm\u00f6glich, einen Analysator zu schreiben, der f\u00fcr jeden Quellcode bestimmt, ob das analysierte Programm eine Implementierung eines Algorithmus ist, der beispielsweise die Quadratzahl einer ganzen Zahl berechnet.<\/p>\n<p>Daher hat die Funktionalit\u00e4t statischer Analysatoren un\u00fcberwindbare Einschr\u00e4nkungen. Ein statischer Analysator wird niemals in der Lage sein, in jedem Fall solche Dinge zu bestimmen, wie zum Beispiel das Auftreten einer \"Nullzeiger-Ausnahme\" in Programmiersprachen, die null-Werte zulassen, oder in jedem Fall das Auftreten von \"Attribut nicht gefunden\" in dynamisch typisierten Sprachen zu bestimmen. Alles, was der perfekteste statische Analysator tun kann, ist, Sonderf\u00e4lle zu identifizieren, deren Anzahl im Vergleich zu allen m\u00f6glichen Problemen mit Ihrem Quellcode ohne \u00dcbertreibung ein Tropfen auf den hei\u00dfen Stein ist.<\/p>\n<h2>Statische Analyse ist kein Fehlerfinden<\/h2>\n<p>\nAus dem Vorangegangenen ergibt sich die Schlussfolgerung: Statische Analyse ist kein Mittel zur Verringerung der Anzahl der Defekte im Programm. Ich wage zu behaupten: Wenn sie zum ersten Mal auf Ihr Projekt angewendet wird, wird sie \"interessante\" Stellen im Code finden, aber wahrscheinlich keine Defekte, die die Qualit\u00e4t der Funktionalit\u00e4t Ihres Programms beeinflussen.<\/p>\n<p>Die Beispiele f\u00fcr Defekte, die automatisiert von Analysatoren gefunden wurden, sind beeindruckend, aber man sollte nicht vergessen, dass diese Beispiele durch das Scannen eines gro\u00dfen Sets gro\u00dfer Codebasen gefunden wurden. Nach dem gleichen Prinzip finden Hacker, die mehrere einfache Passw\u00f6rter auf vielen Konten ausprobieren, schlie\u00dflich die Konten, auf denen ein einfaches Passwort steht.<\/p>\n<p>Bedeutet das, dass statische Analyse nicht angewendet werden sollte? Nat\u00fcrlich nicht! Und genau aus dem gleichen Grund, aus dem man jedes neue Passwort auf die Aufnahme in die Liste der \"einfachen\" Passw\u00f6rter \u00fcberpr\u00fcfen sollte.<\/p>\n<h2>Statische Analyse ist mehr als nur Fehlerfinden<\/h2>\n<p>\nIn der Tat sind die durch Analyse praktisch l\u00f6sbaren Aufgaben viel breiter. Denn im Allgemeinen ist die statische Analyse jede \u00dcberpr\u00fcfung des Quellcodes, die vor dessen Ausf\u00fchrung durchgef\u00fchrt wird. Hier sind einige Dinge, die man tun kann:<\/p>\n<ul>\n<li> \u00dcberpr\u00fcfung des Programmierstils im weitesten Sinne. Dazu geh\u00f6rt sowohl die \u00dcberpr\u00fcfung des Formats als auch die Suche nach der Verwendung von \u00fcberfl\u00fcssigen\/falschen Klammern, das Setzen von Schwellenwerten f\u00fcr Metriken wie die Anzahl der Zeilen\/komplexe zyklomatische Komplexit\u00e4t einer Methode usw. - alles, was die Lesbarkeit und Wartbarkeit des Codes potenziell erschwert. In Java ist ein solches Werkzeug Checkstyle, in Python - flake8. Programme dieser Art werden normalerweise als \u201eLinter\u201c bezeichnet.<\/li>\n<li>Nicht nur der ausf\u00fchrbare Code kann analysiert werden. Ressourcendateien wie JSON, YAML, XML, .properties k\u00f6nnen (und sollten!) automatisch auf G\u00fcltigkeit gepr\u00fcft werden. Es ist besser, fr\u00fchzeitig bei der automatischen \u00dcberpr\u00fcfung eines Pull Requests zu erfahren, dass aufgrund ungerader Anf\u00fchrungszeichen die Struktur von JSON verletzt ist, als w\u00e4hrend der Testausf\u00fchrung 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 bedeutet Kompilierung nicht nur die Kompilierung des 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>) bei der Umwandlung in HTML\/PDF Warnungen ausgeben, beispielsweise \u00fcber gebrochene interne Links. Und das ist ein gewichtiger Grund, einen Pull Request mit \u00c4nderungen an der Dokumentation abzulehnen.<\/li>\n<li>Rechtschreibpr\u00fcfung ist ebenfalls eine Form der statischen Analyse. Das Werkzeug <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 (in Kommentaren und Literalen) in verschiedenen Programmiersprachen, einschlie\u00dflich C\/C++, Java und Python, \u00fcberpr\u00fcfen. Ein Rechtschreibfehler in der Benutzeroberfl\u00e4che oder Dokumentation ist ebenfalls ein Defekt!<\/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\">diesen<\/a><\/noindex> und <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=Tk_nmV-mWOA\">diesen<\/a><\/noindex> Berichte), obwohl sie in einer Umgebung f\u00fcr modulare Tests wie pytest ausgef\u00fchrt werden, sind tats\u00e4chlich auch 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 die Fehlersuche in dieser Liste die geringste Rolle, w\u00e4hrend alles andere durch die Nutzung kostenloser Open-Source-Werkzeuge verf\u00fcgbar ist.<\/p>\n<p>Welche dieser Arten der statischen Analyse sollten in Ihrem Projekt verwendet werden? Nat\u00fcrlich alle, je mehr, desto besser! Wichtig ist, dass dies richtig implementiert wird, worum es weiter gehen wird.<\/p>\n<h2>Die Lieferkette als mehrstufiger Filter und die statische Analyse als deren erster Kaskade<\/h2>\n<p>\nEine klassische Metapher der kontinuierlichen Integration ist ein Pipeline, durch die \u00c4nderungen flie\u00dfen \u2013 von der \u00c4nderung des Quellcodes bis zur Bereitstellung in der Produktion. Der Standardablauf dieser Pipeline sieht folgenderma\u00dfen aus:<\/p>\n<ol>\n<li>statische Analyse<\/li>\n<li>Kompilierung<\/li>\n<li>modular Tests<\/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 genau so und nicht anders? In dem Teil der Pipeline, der das Testen betrifft, erfahren Tester von der weithin bekannten Testpyramide.<\/p>\n<p><img decoding=\"async\" alt=\"Integrieren Sie die statische Analyse in den Prozess und suchen Sie nicht mit ihrer Hilfe nach Bugs.\" 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>Im unteren Teil dieser Pyramide befinden sich Tests, die leichter zu schreiben sind, schneller ausgef\u00fchrt werden und keine Neigung zu Fehlalarmen haben. Deshalb sollte ihre Anzahl gr\u00f6\u00dfer sein, sie sollten mehr Code abdecken und zuerst ausgef\u00fchrt werden. In der oberen H\u00e4lfte der Pyramide ist es umgekehrt, weshalb die Anzahl der Integrations- und UI-Tests auf ein notwendiges Minimum reduziert werden sollte. Der Mensch in dieser Kette ist die teuerste, langsamste und unzuverl\u00e4ssigste Ressource, deshalb steht er am Ende und f\u00fchrt die Arbeit nur aus, wenn die vorherigen Phasen keine Defekte festgestellt haben. Die Pipeline wird jedoch nach denselben Prinzipien aufgebaut, auch in Teilen, die nicht direkt mit dem Testen zu tun haben!<\/p>\n<p>Ich m\u00f6chte eine Analogie in Form eines mehrstufigen Wasserfilters vorschlagen. Uns wird schmutziges Wasser (\u00c4nderungen mit Defekten) zugef\u00fchrt, und am Ende sollten wir sauberes Wasser erhalten, aus dem alle unerw\u00fcnschten Verunreinigungen herausgefiltert wurden.<\/p>\n<p><img decoding=\"async\" alt=\"Integrieren Sie die statische Analyse in den Prozess und suchen Sie nicht mit ihrer Hilfe nach Bugs.\" 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, werden Reinigungssysteme so konzipiert, dass jede nachfolgende Stufe zunehmend feinere Fraktionen von Verunreinigungen abfiltern kann. In diesem Sinne haben die Stufen der groben Reinigung eine h\u00f6here Durchsatzleistung und niedrigere Kosten. In unserer Analogie bedeutet dies, dass die Eingangs-Qualit\u00e4tsschranken eine h\u00f6here Effizienz haben, weniger Aufwand f\u00fcr den Start erfordern und selbst weniger w\u00e4hlerisch im Betrieb sind \u2014 und genau in dieser Reihenfolge sind sie angeordnet. Die Rolle der statischen Analyse, die, wie wir nun verstehen, nur die gr\u00f6bsten Fehler herausfiltern kann, ist die Rolle eines \u201eSchmutzsiebes\u201c zu Beginn der Filterstufen.<\/p>\n<p>Statische Analyse verbessert f\u00fcr sich genommen nicht die Qualit\u00e4t des Endprodukts, \u00e4hnlich wie ein Schmutzsieb das Wasser nicht trinkbar macht. Dennoch ist ihre Bedeutung in Kombination mit anderen Elementen der Pipeline offensichtlich. Obwohl die Ausgangsstufen eines mehrstufigen Filters potenziell in der Lage sind, alles zu erfassen, was auch die Eingangsfilter filtern, ist klar, zu welchen Folgen der Versuch f\u00fchren wird, sich ausschlie\u00dflich auf die feinen Filterstufen zu verlassen, ohne die Eingangsfilter.<\/p>\n<p>Das Ziel des \u201eSchmutzsiebes\u201c ist es, die nachfolgenden Stufen von der Erfassung der wirklich groben Fehler zu entlasten. Zum Beispiel sollte mindestens derjenige, der einen Code-Review durchf\u00fchrt, sich nicht mit falsch formatiertem Code und Verst\u00f6\u00dfen gegen die festgelegten Kodierungsnormen (wie \u00fcberfl\u00fcssigen Klammern oder zu tief verschachtelten Verzweigungen) ablenken lassen. Bugs wie NPE sollten durch Unit-Tests erfasst werden, aber wenn der Analyzer uns bereits vor dem Test darauf hinweist, dass ein Bug unvermeidlich auftreten wird, beschleunigt das seine Behebung erheblich.<\/p>\n<p>Ich denke, jetzt ist klar, warum die statische Analyse die Qualit\u00e4t des Produkts nicht verbessert, wenn sie episodisch angewendet wird, und sie kontinuierlich eingesetzt werden sollte, um \u00c4nderungen mit groben Fehlern herauszufiltern. Die Frage, ob der Einsatz eines statischen Analysetools die Qualit\u00e4t Ihres Produkts verbessert, ist etwa gleichbedeutend mit der Frage \u201eWird die Trinkqualit\u00e4t von Wasser aus einem schmutzigen Gew\u00e4sser verbessert, wenn man es durch ein Sieb gie\u00dft?\u201c<\/p>\n<h2>Implementierung in ein Legacy-Projekt<\/h2>\n<p>\nWichtige praktische Frage: Wie implementiert man statische Analyse als \u201eQualit\u00e4tsgate\u201c im Prozess der kontinuierlichen Integration? Bei automatisierten Tests ist alles offensichtlich: Es gibt eine Reihe von Tests, und das Scheitern eines einzelnen von ihnen ist ein ausreichender Grund, anzunehmen, dass die Build-Qualit\u00e4tsanforderung nicht bestanden wurde. Der Versuch, ein Gate basierend auf den Ergebnissen der statischen Analyse auf die gleiche Weise festzulegen, scheitert: Bei Legacy-Code gibt es zu viele Analysewarnungen, die vollst\u00e4ndig zu ignorieren man nicht m\u00f6chte, aber es ist auch unm\u00f6glich, die Produktlieferung nur zu stoppen, weil es in ihm Warnungen vom Analyzer gibt.<\/p>\n<p>Wenn der Analyzer erstmalig angewendet wird, gibt er in jedem Projekt eine enorme Anzahl von Warnungen aus, die \u00fcberwiegende Mehrheit davon hat jedoch nichts mit der ordnungsgem\u00e4\u00dfen Funktion des Produkts zu tun. Es ist unm\u00f6glich, sofort all diese Anmerkungen zu beheben, und viele m\u00fcssen nicht einmal behoben werden. Schlie\u00dflich wissen wir, dass unser Produkt insgesamt funktioniert, und das sogar bevor die statische Analyse eingef\u00fchrt wurde!<\/p>\n<p>Infolgedessen beschr\u00e4nken sich viele auf sporadische Nutzung der statischen Analyse oder verwenden sie lediglich im Informationsmodus, wenn beim Build einfach der Bericht des Analyzers ausgegeben wird. Das entspricht dem Fehlen jeglicher Analyse, denn wenn wir bereits eine Vielzahl von Warnungen haben, bleibt das Auftreten einer weiteren (so ernst sie auch sein mag) beim \u00c4ndern des Codes unbemerkt.<\/p>\n<p>Die folgenden Methoden zur Einf\u00fchrung von Qualit\u00e4tsgates sind bekannt:<\/p>\n<ul>\n<li>Festlegung eines Limits f\u00fcr die Gesamtzahl der Warnungen oder f\u00fcr die Anzahl der Warnungen, geteilt durch die Anzahl der Codezeilen. Dies funktioniert schlecht, da ein solches Gate \u00c4nderungen mit neuen Fehlern problemlos passieren l\u00e4sst, solange das Limit nicht \u00fcberschritten wird.<\/li>\n<li>Die Erfassung aller alten Warnungen im Code zu einem bestimmten Zeitpunkt als ignoriert und die Ablehnung des Builds bei neuen Warnungen. Diese Funktionalit\u00e4t bietet PVS-Studio und einige Online-Ressourcen wie Codacy. Ich hatte noch nicht das Vergn\u00fcgen, mit PVS-Studio zu arbeiten, was Codacy betrifft, so liegt ihr Hauptproblem darin, dass es ziemlich kompliziert ist, zu bestimmen, was ein \u201ealter\u201c und was ein \u201eneuer\u201c Fehler ist \u2013 ein Algorithmus, der nicht immer korrekt funktioniert, insbesondere wenn sich die Dateien stark \u00e4ndern oder umbenannt werden. Meiner Erinnerung nach konnte Codacy neue Warnungen im Pull-Request \u00fcbersehen, w\u00e4hrend gleichzeitig der Pull-Request aufgrund von Warnungen, die nicht mit den \u00c4nderungen dieses PR zu tun hatten, nicht genehmigt wurde.<\/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 Grundidee ist, dass die Eigenschaft jeder Version die Anzahl der Warnungen der statischen Analyse ist, und es sind nur solche \u00c4nderungen erlaubt, 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 Anfangsphase wird im Metadaten \u00fcber die Version die Anzahl der im Code gefundenen Warnungen durch die Analysewerkzeuge aufgezeichnet. So wird bei der Erstellung des Hauptzweigs in Ihrem Repository-Manager nicht einfach \u201eVersion 7.0.2\u201c aufgezeichnet, sondern \u201eVersion 7.0.2, die 100500 Checkstyle-Warnungen enth\u00e4lt\u201c. Wenn Sie einen fortschrittlichen Repository-Manager (wie Artifactory) verwenden, ist es einfach, solche Metadaten \u00fcber Ihre Version zu speichern.<\/li>\n<li>Jetzt vergleicht jeder Pull-Request bei der Erstellung die Anzahl der erhaltenen Warnungen mit der Anzahl, die in der aktuellen Version vorhanden ist. Wenn der PR zu einer Erh\u00f6hung dieser Zahl f\u00fchrt, besteht der Code den Quality Gate des statischen Analyseprozesses nicht. Wenn die Anzahl der Warnungen verringert oder unver\u00e4ndert bleibt, wird er genehmigt.<\/li>\n<li>Bei der n\u00e4chsten Version wird die neu berechnete Anzahl der Warnungen erneut in den Metadaten der Version aufgezeichnet.<\/li>\n<\/ol>\n<p>\nSo wird die Anzahl der Warnungen langsam, aber stetig (wie bei der Arbeit mit einem Ratschensystem) gegen Null tendieren. Nat\u00fcrlich kann das System \u00fcberlistet werden, indem eine neue Warnung durch das Korrigieren einer bestehenden eingef\u00fcgt wird. Das ist in Ordnung, da es auf lange Sicht Ergebnisse liefert: Warnungen werden in der Regel nicht einzeln, sondern gemeinsam in Gruppen eines bestimmten Typs behoben, und alle leicht behebbaren Warnungen werden relativ schnell behoben.<\/p>\n<p>In diesem Diagramm wird die Gesamtanzahl der Checkstyle-Warnungen \u00fcber einen Zeitraum von sechs Monaten w\u00e4hrend der Arbeit eines solchen \u201eRatschensystems\u201c auf <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\">einem unserer OpenSource-Projekte<\/a><\/noindex>. Die Anzahl der Warnungen hat sich um ein Vielfaches verringert, und das geschah auf nat\u00fcrliche Weise, parallel zur Produktentwicklung!<\/p>\n<p><img decoding=\"async\" alt=\"Integrieren Sie die statische Analyse in den Prozess und suchen Sie nicht mit ihrer Hilfe nach Bugs.\" src=\"\/wp-content\/uploads\/2019\/05\/9529bb2fb32187057088e8d2c4203333.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIch wende eine modifizierte Version dieser Methode an, wobei ich die Warnungen nach Modulen des Projekts und Analysewerkzeugen getrennt z\u00e4hle. 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 fortgeschrittenen CI-System kann das \u201eRatschensystem\u201c f\u00fcr beliebige statische Analysewerkzeuge implementiert werden, ohne auf Plugins und externe Tools angewiesen zu sein. Jeder der Analyzer gibt seinen Bericht in einem einfachen Text- oder XML-Format aus, das leicht analysierbar ist. Es bleibt nur die notwendige Logik im CI-Skript zu codieren. Man kann sehen, wie dies in unseren Open-Source-Projekten auf Basis von Jenkins und Artifactory umgesetzt wurde <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 gew\u00f6hnlich die XML-Tags in den von Checkstyle und Spotbugs generierten Dateien, w\u00e4hrend <code>compareWarningMaps()<\/code> das eigentliche Ratschensystem implementiert, das einen Fehler ausl\u00f6st, wenn die Anzahl der Warnungen in einer der Kategorien ansteigt.<\/p>\n<p>Eine interessante Implementierungsoption f\u00fcr einen \u201eRatschenmechanismus\u201c ist die Analyse der Rechtschreibung von Kommentaren, Textliteralen und Dokumentationen mithilfe von aspell. Wie bekannt ist, sind bei der Rechtschreibpr\u00fcfung nicht alle unbekannten W\u00f6rter im Standardw\u00f6rterbuch falsch; sie k\u00f6nnen dem benutzerdefinierten W\u00f6rterbuch hinzugef\u00fcgt werden. Wenn das benutzerdefinierte W\u00f6rterbuch Teil des Quellcodes des Projekts wird, kann das Qualit\u00e4tsgate bez\u00fcglich der Rechtschreibung wie folgt formuliert werden: Ausf\u00fchrung von aspell mit dem Standard- und dem benutzerdefinierten W\u00f6rterbuch. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\/blob\/271dcfc8dc3ad65ac2d1dcaa39b7fd3ea8fb5891\/Jenkinsfile#L36\">sollte<\/a><\/noindex> keine Rechtschreibfehler finden.<\/p>\n<h2>Zur Bedeutung der Versionsfixierung des Analysators<\/h2>\n<p>\nZusammenfassend l\u00e4sst sich Folgendes sagen: Egal, wie Sie die Analyse in Ihre Lieferpipeline integrieren, die Version des Analysators sollte festgelegt sein. Wenn eine spontane Aktualisierung des Analysators zugelassen wird, k\u00f6nnen beim Bauen eines neuen Pull Requests neue Fehler \u201eauftauchen\u201c, die nicht mit \u00c4nderungen am Code, sondern damit zusammenh\u00e4ngen, dass der neue Analysator einfach in der Lage ist, mehr Fehler zu finden \u2013 und das wird Ihren Prozess der Annahme von Pull Requests st\u00f6ren. Das Update des Analysators sollte eine bewusste Handlung sein. Im \u00dcbrigen ist die strenge Fixierung der Version jeder Komponente des Builds eine im Allgemeinen notwendige Anforderung und ein Thema f\u00fcr ein separates Gespr\u00e4ch.<\/p>\n<h2>Das DBMS Tarantool ist ein attraktives, zukunftstr\u00e4chtiges Produkt zur Erstellung von hochbelasteten Anwendungen.<\/h2>\n<p><\/p>\n<ul>\n<li>Statische Analysen finden Ihnen keine Bugs und verbessern die Qualit\u00e4t Ihres Produkts nicht durch einmalige Anwendung. Der positive Effekt auf die Qualit\u00e4t ergibt sich nur aus der kontinuierlichen Anwendung im Lieferprozess.<\/li>\n<li>Die Fehlersuche ist generell nicht die Hauptaufgabe der Analyse; die \u00fcberw\u00e4ltigende Mehrheit der n\u00fctzlichen Funktionen ist in Open-Source-Tools verf\u00fcgbar.<\/li>\n<li>Implementieren Sie Qualit\u00e4tsgate basierend auf den Ergebnissen der statischen Analyse bereits im fr\u00fchesten Stadium der Lieferpipeline, indem Sie den \u201eRatschenmechanismus\u201c f\u00fcr Legacy-Code verwenden.<\/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: Programm Analyse: Wie erkennt man, dass man ein guter Programmierer ist<\/a><\/noindex> Vortrag \u00fcber verschiedene Methoden zur Codeanalyse (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 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u0435\u043d\u044f \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430.\" \/>\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) 5.0.1.1\" \/>\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.\" \/>\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\udd47Implementieren Sie die statische Analyse im Prozess und suchen Sie nicht mit ihrer Hilfe nach Bugs | ProHoster","description":"Ich wurde durch die gro\u00dfe Anzahl an Materialien \u00fcber statische Analysen, die mir immer h\u00e4ufiger begegnen, angeregt, diesen Artikel zu schreiben.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}