Es ist eine Schande für Meinungen über statische Code-Analysatoren

Tools zur statischen Code-Analyse sind weit fortgeschritten. Dies sind überhaupt nicht die "Linters", die vor 20 Jahren aktiv verwendet wurden. Viele bezeichnen sie jedoch immer noch als sehr einfache Werkzeuge. Es ist Schande. Es ist eine Schande sowohl für die Methodik der Code-Analyse im Allgemeinen als auch für das PVS-Studio-Tool.







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







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



All Articles