Was ist der Unterschied zwischen statischer Code-Analyse und Code-Überprüfung?

9

Ich wollte nur wissen, was der Unterschied zwischen statischer Code-Analyse und Code-Überprüfung ist. Wie wird jeder dieser beiden gemacht? Welche Tools stehen heute für die Codeüberprüfung / statische Analyse von PHP zur Verfügung? Ich würde auch gerne gute Tools für die Codeüberprüfung für jede Sprache kennenlernen.

Thomas Owens
quelle
Eine Codeüberprüfung ist im Allgemeinen ein manueller Vorgang, bei dem ein anderer Programmierer Ihren Code überprüft. Dies ist eine Möglichkeit, kleine Fehler oder Abweichungen von Codierungskonventionen usw. zu erkennen und die allgemeine Codequalität zu verbessern. Statische Code-Analyse ist etwas, für das Sie ein Tool verwenden können, obwohl ich dies selbst nie getan habe. Interessiert zu sehen, welche Antworten andere haben
9
In zwei Worten? "Ein Gehirn".
MSalters

Antworten:

19

Codeüberprüfung ist etwas, was Menschen tun, statische Analyse ist etwas, was Maschinen tun. Es gibt (manchmal gute) statische Analysewerkzeuge. Codeüberprüfung ist, wenn ein Kollege / Mentor / Professor / Freund Ihren Code durchgeht und Sie konstruktiv kritisiert.

Die statische Analyse ist andererseits ein automatisierter Prozess, bei dem eine Maschine, die über ihre Kenntnisse über die zu analysierende Sprache informiert ist (normalerweise aus dem Typensystem), ein Programm analysiert und versucht, Dinge herauszusuchen, die falsch sein könnten. ineffizient, schlechter Stil oder auf andere Weise suboptimal.

Rafe Kettler
quelle
2
Ich hatte immer den Eindruck, dass die Codeüberprüfung eine Art statische Analyse ist, da hiermit der Zustand der Software gemessen werden kann, ohne sie auszuführen.
Buhb
4
@Buhb: Es fügt entscheidend Wissen über den Kontext hinzu. Ein Code-Prüfer sollte verstehen, ob der Code das tut, was erwartet wird. Ein statisches Tool prüft (bestenfalls, wenn die Sprache dies durch eine Dekoration / Behauptung / einen Vertrag zulässt), ob formal alles in Ordnung ist. Sie könnten es also anders ausdrücken: Die statische Analyse ist eine Art Codeüberprüfung, die durchgeführt wird algorithmisch.
Francesco
Nur um hinzuzufügen, Lint (statischer Analyst): Alter, der nicht benötigt wird !! Kollege (Rezensent): Sie können es auch so machen !!
Kushal
11

Bei der statischen Analyse wird eine Software analysiert, ohne sie auszuführen. Dies ist sehr gut und wird empfohlen, aber Sie müssen dies berücksichtigen

  1. Verschiedene statische Analysewerkzeuge haben ein unterschiedliches Verständnis des Codes, den sie untersuchen, und können daher unterschiedliche Probleme signalisieren (oder nicht signalisieren). Ein Tool kann einen sauberen Bericht erstellen, das andere kann sich über eine Million Dinge beschweren.
  2. Ein dynamisches Tool (um ein Beispiel zu nennen, denken Sie an Valgrind) kann viele andere Probleme finden, und zwar zum Preis einer ernsthaften Belastung des Ressourcenverbrauchs (Zeit, Speichernutzung). Dies liegt daran, dass Sie normalerweise eine instrumentierte Version der Software ausführen. Beachten Sie, dass es durch eine Instrumentierung (ersetzen Sie Ihr Malloc durch ein Debugging-Malloc) nicht genau mit Ihrer Software identisch ist (wie Sie anhand der Ausführungszeiten sehen können).

Beide Ansätze leiden unter dem Mangel an Kontext: Sie wissen nicht, was der SW erreichen soll.

Die Codeüberprüfung wird von einem anderen Codierer durchgeführt, der sie angeblich kennt und überprüfen kann

  1. wenn der Code stimmt
  2. wenn die Software semantisch korrekt ist.

Es ist viel teurer und hat einen unterschiedlichen Grad an Wiederholbarkeit, ist aber eine große Hilfe.

Wie immer gibt es keine einzige Silberkugel, die alle Fehler behebt und alle Probleme vermeidet. Anwenden - so viel wie möglich in Anbetracht des Ortes, des Codes, der Zeit, der drei Arten der Überprüfung (statisch, dynamisch, mehr Augen (und Gehirne), die den Code tatsächlich betrachten) wird empfohlen.

ps: Ich muss beachten, dass es normalerweise viel besser ist, die Werkzeuge von Grund auf neu anzuwenden. Das Konvertieren eines Legacy-Systems ist aufgrund von Fehlalarmen weniger angenehm. Wenn Sie bei Null anfangen und immer darauf abzielen, das Analysetool sauber zu halten, werden Sie wahrscheinlich viele Probleme vermeiden.

pps: Bei Tools hängt es von der Sprache ab. In der C- und C ++ - Welt können Sie zunächst Visual Studio selbst betrachten, das ein integriertes statisches Analysetool enthält. Eine relativ vollständige Liste finden Sie auf Wikipedia.

ppps: Die statische Analyse eignet sich eher für statische Sprachen wie C oder C ++. Für Python kann es sehr schwierig sein zu sagen, ob ein Name, der zu einem bestimmten Zeitpunkt auf eine Liste verweist, aufgrund seiner dynamischen Eigenschaften auf eine Liste für den Rest des Programms verweist. Dies bedeutet nicht, dass nichts getan werden kann, wie eine JIT-Anstrengung wie PyPy zeigt.

Francesco
quelle
2

Codeüberprüfung ist, wenn ein leitender Angestellter oder eine dedizierte Behörde Ihren Code, Ihre Codierungsweise, die im Code befolgten Standards und insbesondere die Logikstufe des Codes überprüft

In Bezug auf die statische Analyse ist es die Analyse von Computersoftware, die durchgeführt wird, ohne tatsächlich Programme auszuführen, die aus dieser Software erstellt wurden (die Analyse, die beim Ausführen von Programmen durchgeführt wird, wird als dynamische Analyse bezeichnet).

Die Liste der Werkzeuge gemäß der Technologie finden Sie unter dem folgenden Link

Liste der Werkzeuge für die statische Analyse

Daher sind Codeüberprüfung und statische Analyse völlig unterschiedliche Begriffe.

OM Die Ewigkeit
quelle
7
Die Antwort von OM ist im Wesentlichen richtig, außer dass ich mit "Ein Senior oder eine dedizierte Behörde überprüft Ihren Code ..." streite. Es ist wahr, dass einige dysfunktionale Geschäfte Codeüberprüfungen auf diese Eltern / Kind-Weise durchführen. Viele (und bessere) Geschäfte verfügen über ein Peer-to-Peer-Codeüberprüfungssystem, das keinem Lehrer ähnelt, der ein Hausaufgabenproblem bewertet. Wo ich arbeite, ist es für einen Junior genauso üblich, die Arbeit eines Senioren zu überprüfen. Das Ziel ist es, dass ein zweites Paar Augen den gesamten Code betrachtet, bevor er eingecheckt wird.
Jim In Texas
2
@ JimInTexas, gleich in unserem Shop. Ich würde sagen, das wichtigste (langfristige) Ergebnis von Codeüberprüfungen ist die Verbreitung von Wissen, die Vereinheitlichung von Praktiken und die Vision von Architektur und Design im gesamten Team. In dieser Hinsicht ist ein Junior, der den Code eines Senioren überprüft, im schlimmsten Fall eine großartige Möglichkeit, lokale Best Practices zu erlernen - aber wer sagt, dass ein Senior niemals Fehler macht und ein Junior diese niemals erkennen kann?
Péter Török
1

Die Codeüberprüfung ist eine qualitativere Bewertung, die statische Code-Analyse eine quantitativere Bewertung.

Hey, Junge, diese Methode kann besser geschrieben werden

vs, fe

Verminderte Leistung. Es ist ineffizient, eine leere Zeichenfolge mithilfe des Konstrukts 'wcslen (str)> 0' zu identifizieren. Eine effizientere Möglichkeit besteht darin, Folgendes zu überprüfen: str [0]! = '\ 0'.

Verminderte Leistung. Der Ausdruck der Art strlen (MyStr.c_str ()) kann als MyStr.length () umgeschrieben werden.

Verminderte Leistung. Wenn 'Order' ein Iterator ist, ist es effektiver, die Präfixform des Inkrements zu verwenden. Ersetzen Sie Iterator ++ durch ++ Iterator.

Während echte Fehler (offensichtlich) existieren und von SCA erkannt werden können

Falsches Format. Überprüfen Sie das N-Argument der Funktion 'Foo'

Der Ausdruck wurde zweimal in Klammern gesetzt: ((Ausdruck)). Ein Klammerpaar ist nicht erforderlich oder es liegt ein Druckfehler vor

Ein Aufruf der Funktion 'memset' führt zum Unterlauf des Puffers 'dest.lfFaceName'.

Fauler Dachs
quelle
Es tut mir leid, dich zu beleidigen. Was mein (verschwundener?) Kommentar bedeuten sollte - kennen Sie einen Grund, warum ein Mensch nicht dieselben Kommentare anbieten kann, die Sie als Beispiele für die Ausgabe der statischen Code-Analyse angeben?
sq33G
@ sq33G: Nein. Jede Person mit Büromaterial (praktisch unendlich viel Papier) kann eine beliebige Turing-Maschine simulieren. Es ist jedoch langweilig und zeitaufwändig. (Möglicherweise nicht das angegebene, sondern undefinierte Verhaltensweisen in C).
Maciej Piechotka
Ah. Die eigentliche Antwort auf die Frage des OP lautet also, dass Turing-Maschinen nicht vollständig sind.
sq33G
0

Statische Analyse ist, wenn ein Artefakt analysiert wird, ohne ausgeführt zu werden. Obwohl es auf jedes Artefakt angewendet werden kann, wird es häufig auf Quellcode oder Objektcode angewendet und bezieht sich auf die Verwendung spezifischer Tools zum Analysieren und Erhalten von Informationen über diese Arbeitsprodukte. Diese Tools erstellen Berichte, die von einem Techniker zur Bestimmung der Qualität des im Bau befindlichen Systems und als Leitfaden für die Planung der Entwicklung und Wartung interpretiert werden. Wikipedia verfügt über eine Liste von Tools für die statische Analyse , die nach Sprache geordnet sind und eine kurze Beschreibung ihrer Funktionen enthalten.

Bewertungen sind eine menschliche Bewertung einiger Arbeitsprodukte, bei denen es sich möglicherweise um Code handelt. Überprüfungen können auch an Entwürfen oder anderen Dokumenten durchgeführt werden. Die Idee ist, dass andere Personen, die mit dem Arbeitsprodukt als dem Entwickler vertraut sind, es betrachten, um Fehler zu finden, die von Sicherheitsproblemen bis zu Verstößen gegen den Codierungsstandard reichen.

Technisch gesehen kann eine Codeüberprüfung als eine Form der statischen Analyse betrachtet werden, da der Code während der Überprüfung nicht tatsächlich ausgeführt wird. In der gebräuchlichen Terminologie bezieht sich "statische Analyse" jedoch normalerweise auf das maschinelle Parsen von Quell- oder Objektdateien, während "Überprüfung" anzeigt, dass Menschen die Analyse durchführen.

Thomas Owens
quelle
-2

Die Codeüberprüfung ist eine nützliche Technik, um Probleme im Quellcode sehr früh zu riechen. Im Rahmen dieser Übung wurden viele Probleme wie Leistung, Skalierbarkeit und Codierungsstandards identifiziert und behoben. Dies verbessert die Codequalität.

Die statische Analyse wird zur Analyse von Codequalitätsmetriken wie zyklometrischer Komplexität, Wartbarkeitsindex, Vererbungstiefe und Klassenkopplungen verwendet. Verschiedene auf dem Markt verfügbare Tools zur Analyse von Codequalitäten. Der C # -Entwickler verwendet Microsoft Visual Studio zum Generieren von Metrikberichten.

Balasubramanian.S
quelle
-3

Die statische Code-Analyse wird von einem automatisierten Tool durchgeführt. Die Code-Überprüfung wird mit Personen durchgeführt, bevor der Code festgeschrieben wird.

Tools zur Codeüberprüfung:

1. jenseits vergleichen

2. der Unterschied der Versionskontrollsoftware

Diese Tools werden immer verwendet, um den Unterschied zwischen der alten und der neuen Version zu generieren.

Upton
quelle
2
1) Es muss nicht sein, bevor der Code festgeschrieben wird - die Codeüberprüfung wird von Personen durchgeführt und 2) Ich finde die Beschreibung von Diff-Tools als Codeüberprüfungswerkzeuge "interessant", sicherlich sind sie Tools, mit denen Code zur Überprüfung identifiziert wird, aber wenn Ich wurde nach Tools zur Codeüberprüfung gefragt, die ich wahrscheinlich auf diejenigen verweisen würde, die bei der Verwaltung des Prozesses helfen (ich habe zum Beispiel Kiln and Crucible verwendet).
Murph