
Der Grund für die Traurigkeit war ein Kommentar zu einem unserer Artikel. In diesem Artikel wurde geschrieben, dass der Analysator einen Tippfehler erkennt, indem er eine Warnung an den folgenden Code ausgibt:
if (A[0] == 0)
{
X = Y;
if (A[0] == 0)
....
}
Der Analysator sagt, dass die zweite Bedingung immer wahr ist. Wenn Sie den Funktionskörper untersuchen, wird klar, dass ein anderes Element des Arrays überprüft werden sollte.
Zu diesem Thema wurde ungefähr folgender Kommentar abgegeben:
Ja, der Analysator zeigt hier einen Fehler an. Im Allgemeinen ist diese Warnung jedoch falsch. Schließlich kann sich zwischen zwei identischen Prüfungen der Wert des Elements ändern, und dann ist die zweite Prüfung sinnvoll.Ich bin traurig. Programmierer denken immer noch, dass Codeanalysatoren auf regulären Ausdrücken basieren. Wie fanden wir zwei identische verschachtelte if und schwören.
Natürlich überwacht jeder moderne statische Analysator Änderungen im Wert von Variablen. Wenn sich die Variable nicht ändert, wird eine Meldung angezeigt. Wenn es sich ändert, wird keine Nachricht angezeigt. Hierzu wird die Datenflussanalysetechnologie eingesetzt.
Genau das leistet der statische Analysator PVS-Studio. Schauen wir uns das folgende synthetische Beispiel an:
char get();
int foo(char *p, bool arg)
{
if (p[1] == 1)
{
if (arg)
p[0] = get();
if (p[1] == 1) // Warning
return 1;
}
if (p[2] == 2)
{
if (arg)
p[2] = get();
if (p[2] == 2) // Ok
return 2;
}
return 3;
}
Der Code enthält zwei ähnliche Blöcke. Zum einen ändert sich die zu prüfende Variable nicht und zum anderen ändert sie sich. Daher gibt der Analysator nur für den ersten Block eine Warnung aus: V547 Ausdruck 'p [1] == 1' ist immer wahr.
Programmierer brauchen sich keine Sorgen zu machen. Moderne Tools sind fortschrittlich und geben nur Warnungen für wirklich verdächtigen Code aus. Es gibt falsch positive Ergebnisse, aber in der Regel sind sie mit dem Vorhandensein von verwirrendem Code verbunden, der selbst für eine Person schwer zu verstehen sein kann.

Zusätzliche Links
- Beispiele für Fehler, die von der V547-Diagnose erkannt wurden .
- Statisches Parsen und reguläre Ausdrücke (warum ist das eine schlechte Idee :).
- Technologien, die im PVS-Studio-Code-Analysator verwendet werden, um Fehler und potenzielle Schwachstellen zu finden .

Wenn Sie diesen Artikel einem englischsprachigen Publikum zugänglich machen möchten, verwenden Sie bitte den Übersetzungslink: Andrey Karpov. Aufregende Meinungen über statische Analysatoren .