Der PVS-Studio-Analysator erwies sich erneut als aufmerksamer als eine Person

Nimm einen Fehler

Indem wir die Warnungen des PVS-Studio-Analysators bei der Überprüfung verschiedener offener Projekte untersuchen, stellen wir immer wieder sicher, wie nützlich dieses Tool sein kann. Der Code-Analysator ist unglaublich aufmerksam und nie müde. Es zeigt Fehler an, die auch bei sorgfältiger Überprüfung des Codes verschwinden. Betrachten Sie einen anderen solchen Fall.

Das letzte Mal schrieb ich eine ähnliche Notiz , in der ich den Quellcode des StarEngine: 2D Game Engine-Projekts studierte. Jetzt hat der Analysator bei der Überprüfung des Qt-Frameworks seine Überlegenheit gegenüber mir gezeigt.

Das letzte Mal haben wir das Qt-Framework 2014 getestet . Es verging viel Zeit, das Projekt änderte sich und viele neue Diagnosen wurden im PVS-Studio-Analysegerät angezeigt. Es ist also durchaus möglich, einen anderen Artikel zu schreiben, den ich gemacht habe.

Beim Schreiben interessanter Fehlerbeispiele bin ich auf diesen Code gestoßen:

QWindowsCursor::CursorState QWindowsCursor::cursorState() { enum { cursorShowing = 0x1, cursorSuppressed = 0x2 }; CURSORINFO cursorInfo; cursorInfo.cbSize = sizeof(CURSORINFO); if (GetCursorInfo(&cursorInfo)) { if (cursorInfo.flags & CursorShowing) // <= V616 .... } 

PVS-Studio hat eine Warnung für diesen Code ausgegeben:

V616 CWE-480 Die benannte Konstante 'CursorShowing' mit dem Wert 0 wird in der bitweisen Operation verwendet. qwindowscursor.cpp 669

Eine instabile Version von PVS-Studio wurde zur Überprüfung verwendet, sodass mein Vertrauen in den Analysator ins Stocken geriet. "Oh, etwas, das wir in den Mechanismen zur Verarbeitung unbenannter Übertragungen gebrochen haben", seufzte ich und schrieb diesen Fall als Fehler an den Bugtracker, der zu einem falsch positiven Ergebnis führte.

Ich war mir absolut sicher, dass der Analysator falsch war. Immerhin wird mit nur wenigen Zeilen darüber geschrieben, dass die CursorShowing- Konstante 1 ist.

Gleichzeitig habe ich versucht, vorsichtig zu sein! Ich habe den Code mehrmals durchgesehen, um sicherzustellen, dass der Analysator falsch ist. Ich habe diesen Code und die entsprechende Meldung als Fehler im Bugtracker entworfen.

Ich habe diesen kleinen Code gründlich durchgesehen und es trotzdem vermasselt. Der Analysator hat Recht, nicht die Person.

In einer detaillierten Untersuchung der Situation stellte sich heraus, dass die benannte cursorShowing- Konstante oben deklariert ist und die CursorShowing- Konstante in der Bedingung verwendet wird. Der Unterschied liegt nur im Anfangsbuchstaben! An einem Ort ist es Kleinbuchstaben und an einer anderen Hauptstadt.

Warum wird der Code kompiliert? Weil die CursorShowing- Konstante ebenfalls existiert. Hier ist ihre Ankündigung:

 class QWindowsCursor : public QPlatformCursor { public: enum CursorState { CursorShowing, CursorHidden, CursorSuppressed }; .... } 

Wie Sie sehen können, ist die CursorShowing- Konstante 0. Daher sagt der PVS-Studio-Analysator zu Recht, dass die Bedingung (cursorInfo.flags & CursorShowing) keinen Sinn ergibt. Die Bedingung ist immer falsch.

Der Analysator hat einen wunderbaren Tippfehler gefunden. Liebe statische Code-Analyse! :) :)


Wenn Sie diesen Artikel einem englischsprachigen Publikum zugänglich machen möchten, verwenden Sie bitte den Link zur Übersetzung: Andrey Karpov. Der PVS-Studio-Analysator hat sich erneut als aufmerksamer als eine Person erwiesen .

Source: https://habr.com/ru/post/de423771/


All Articles