Was sind die wirklichen Vorteile der statischen Code-Analyse?

18

Mit Tools wie pc-lint oder QAC kann eine statische Code-Analyse auf Codebasis durchgeführt werden.

Nach meiner Erfahrung führt die statische Analyse häufig zu einem enormen Rauschen, dh zu Warnungen vor Dingen, die keine echten Fehler sind, aber irgendwie gegen eine der Regeln in einem bestimmten Regelsatz verstoßen. Das Deaktivieren bestimmter Regeln (entweder für immer im Regelsatz oder über spezielle Kommentare im Code) kann ein sehr umständlicher Vorgang sein.

Was sind die wirklichen Vorteile der statischen Code-Analyse?

cschol
quelle

Antworten:

17

Ich habe an einem Ort gearbeitet, an dem ein kommerzielles statisches Code-Analysesystem namens Coverity Prevent verwendet wurde, und es war verdammt erstaunlich! Es ist wirklich raffiniert und intelligent.

Wir haben ungefähr 18 GB Open-Source- und proprietären C- und C ++ - Code darauf geworfen, und es würde die Codepfade nachverfolgen und schnell subtile Fehler finden, die einen Menschen für immer brauchen würden, um sie aufzuspüren. Es war auch großartig, Dinge zu lokalisieren, die normalerweise Heisenbugs waren.

Es lief alle paar Tage gegen unsere Codebasis, und ein nettes Feature war, dass wir sagen konnten: "Das ist nicht wirklich ein Fehler", und es würde sich in Zukunft daran erinnern.

Das Problem ist, Coverity ist sehr teuer. Sie veröffentlichen die Kosten nicht, aber ich habe das Gefühl, dass sie bei kommerziellen Projekten im Bereich von Hunderttausenden von Dollar pro Jahr anfangen. Aber es hat uns wahrscheinlich erspart, eine ganze Reihe von Entwicklern und QS-Mitarbeitern einzustellen, sodass unser Management im Großen und Ganzen den Eindruck hatte, es sei ein guter Kauf.

Nachdem ich diese Erfahrung gemacht habe, sehe ich die statische Code-Analyse recht positiv.

Bob Murphy
quelle
2
Die Deckung wird von kLOC berechnet, glaube ich.
Paul Nathan
1
kLOC oder Teamgröße
StingyJack
7

Wenn Sie mit einer neuen Sprache anfangen, ist es schön, einen Trainer zu haben. So stelle ich mir statische Analysewerkzeuge vor. Ich schreibe viel Javascript und am Anfang habe ich ein paar schlechte Gewohnheiten aufgegriffen, hauptsächlich, weil ich einige Dinge aus früheren Sprachen übertragen habe. Javascript ist ziemlich flexibel, so dass Sie mit so ziemlich allem davonkommen können, aber wenn ich von jslint vor bestimmten Mustern gewarnt worden wäre, hätte ich von Anfang an bessere Codierungsmuster aufgenommen, anstatt später etwas neu lernen zu müssen.

davidk01
quelle
6

Statische Analysegeräte sind im Grunde maschinengestützte Codeüberprüfungen. Sie weisen auf fragwürdige Bereiche hin, die bei regelmäßigen Tests möglicherweise übersehen werden.

Wollte der Autor zum Beispiel wirklich eine Zuweisung unter dieser Bedingung vornehmen?

if (x = 1) {
    ...
}

Oder vielleicht verwirrt ein Anfänger das lexikalische Casting:

char* number = "123";
int converted = number;

Sicherlich müssen statische Analysatoren angepasst werden. Andererseits erfordern auch die Versionskontrolle, Wikis, Bug-Tracker, hübsche Drucker und andere Tools einige Einstellungen. Je größer das Projekt ist, desto besser ist die Belohnung für die anfängliche Arbeit.

Chrisaycock
quelle
5

Aus Sicht eines Beraters weist jedes statische Analysetool einige Geräusche auf, aber nicht alle statischen Analysegeräte sind gleich. Statische Analysewerkzeuge wie Coverity, Klocwork und Grammatech verfügen über gute Analysetechniken, die genauere Ergebnisse liefern sollten. Wenn Sie mehr optimieren und optimieren, erhalten Sie in der Regel bessere Ergebnisse (schließlich müssen statische Analysegeräte in der Lage sein, alle Arten von Code von einem winzigen medizinischen Gerät bis zu einem Netzwerkbetriebssystem auszuführen). Die Definition von "Rauschen" hängt auch von Ihren Kriterien ab, die für einen Bericht gelten, der festgeschrieben werden muss. An einem Ende des Spektrums markieren einige Entwickler alle Berichte, die sie nicht reparieren, als "falsch" (selbst schlecht geschriebenen Code, für den sie keine Zeit haben) und am anderen Ende als "falsch".

Einige dieser Tools konzentrieren sich auf zentrale Analysen, andere auf den Desktop - obwohl alle drei Funktionen beide unterstützen. Wie @Bob erwähnt, kosten sie Geld.


quelle
4

In meiner vorherigen Firma haben wir den statischen Analysator von Parasoft verwendet. Innerhalb des Teams wurde davon ausgegangen, dass mindestens 60% der Laufzeitfehler vor der Kompilierung entdeckt wurden.

Manoj R
quelle
2

Die statische Analyse kann auch ohne Werkzeuge durchgeführt werden, indem der Softwarecode manuell überprüft wird. Dies ist häufig die kostengünstigste Methode zur Verbesserung der Codequalität.

Die zweitbeste Option ist die Investition in ein oder mehrere hochwertige statische Analysewerkzeuge (wie zuvor erwähnt Coverity oder KLOCwork). Da diese Tools wesentlich tiefere Analysen durchführen als beispielsweise Flusen, ist das Signal-Rausch-Verhältnis viel besser.

Wegen des hohen Geräuschpegels halte ich Flusen für die dritte Option. Das Anwenden von Flusen auf ein vorhandenes Projekt kann eine entmutigende Aufgabe sein.

Im Allgemeinen hat die statische Programmanalyse in den letzten Jahren große Fortschritte gemacht. Aktuelle statische Analysewerkzeuge sind in der Lage, tiefe interprocedurale Analysen durchzuführen, und können beispielsweise Verfahrensvor- und -nachbedingungen automatisch identifizieren. Dies kann auch eine große Hilfe für spätere Codeüberprüfungen sein.

Schedler
quelle
1

Aufgrund der hohen Falsch-Positiv-Rate sollten Sie für jede Kompilierung kein statisches Analysetool (wie Lint oder FindBugs) verwenden.

Es ist eher eine nette Überprüfung der geistigen Gesundheit, wenn Sie einen Fehler haben und ihn nicht herausfinden können . In diesem Fall können Sie die Fehlalarme unterhalten, und möglicherweise haben Sie die möglichen Fehlerquellen bereits eingegrenzt. Wenn Sie beispielsweise Ihren Fehler reproduzieren, ohne ein Modul auszuführen, können Sie ignorieren, was FindBugs für sie sagt. Dies ist besonders hilfreich, wenn Sie sich einen Code ansehen und glauben , dass er eine Sache sagt, während der Compiler ihn wörtlich liest (wie in Java, wenn Sie eine equalsMethode haben, die den Typ der Klasse anstelle von akzeptiert Object).

Sie können auch statische Analysetools als Teil Ihres Entwicklungsprozesses verwenden: Wenn ein Entwickler eine Codeüberprüfung erhält, sollte er auch FindBugs darauf ausführen. Kurz gesagt, es ist nützlich, aber Sie werden es nicht so oft verwenden wie den Compiler oder den Texteditor.

Macneil
quelle
1
Ich würde dagegen argumentieren. Das ist anekdotisch und ich bin sicher, dass es bei älteren / größeren Projekten schlimmer ist, aber das Durchsortieren des Rauschens war nicht so schlimm. Ich habe PC-Lint so eingerichtet, dass viele Auslöser, die viele Fehlalarme auslösen, ignoriert und häufiger ausgeführt werden (und dann weniger häufig ausgeführt werden). Je länger Sie warten, desto schlimmer wird es!
Frederick