PVS-Studio 6.26 Release

PVS-Studio 6.26

Normalerweise schreiben wir keine Notizen zur Veröffentlichung der neuen Version des PVS-Studio-Analysators. Die neue Version enthält jedoch viele interessante Änderungen in Bezug auf die Analyse von C- und C ++ - Code, über die wir unsere Benutzer informieren möchten.

Java kommt bald


Um ehrlich zu sein, sind die neuesten und interessantesten Innovationen in PVS-Studio immer noch verborgen. Ich meine Unterstützung im Java Language Analyzer. Es gibt noch keine öffentliche Beta-Version von PVS-Studio für Java, diese wird jedoch in Kürze verfügbar sein. Wenn Sie an den Tests teilnehmen möchten, können Sie uns zur Unterstützung schreiben (wählen Sie: Ich möchte einen Analysator für Java).

Neue Diagnose für C und C ++


In der neuen Version haben wir uns ein wenig mitreißen lassen und sofort 15 Allzweckdiagnosen für C und C ++ (V1021-V1035) hinzugefügt. In einer kleineren Version wurden noch nie so viele Diagnosen gleichzeitig hinzugefügt. Weitere Details zu den einzelnen Diagnosen finden Sie in der Dokumentation . Meiner Meinung nach sind die interessantesten unter den neuen Diagnosen:

  • V1026. Die Variable wird in der Schleife inkrementiert. Bei einem vorzeichenbehafteten Ganzzahlüberlauf tritt ein undefiniertes Verhalten auf.
  • V1033. Die Variable wird in C als auto deklariert. Der Standardtyp ist int.

Diagnose V1026 erstellt basierend auf der Diskussion im Forum linux.org.ru. Der Programmierer beschwerte sich über einen Fehler im GCC 8-Compiler, aber wie sich später herausstellte, war der Fehler der falsche Code, was zu undefiniertem Verhalten führte. Schauen wir uns diesen Fall an.

Hinweis In der ursprünglichen Diskussion ist die Variable s vom Typ const char * s . Darüber hinaus ist auf der Zielplattform der Zeichentyp ohne Vorzeichen. Aus Gründen der Übersichtlichkeit habe ich im Beispiel sofort geschrieben, dass der Typ des Zeigers const unsigned char * ist .

int foo(const unsigned char *s) { int r = 0; while(*s) { r += ((r * 20891 + *s *200) | *s ^ 4 | *s ^ 3) ^ (r >> 1); s++; } return r & 0x7fffffff; } 

Der Compiler generiert keinen Code für den bitweisen AND-Operator (&). Aus diesem Grund gibt die Funktion negative Werte zurück, obwohl dies nicht der Absicht des Programmierers entsprechen sollte.

Der Entwickler glaubt, dass dies ein Fehler im Compiler ist. Aber der Programmierer, der solchen Code geschrieben hat, ist tatsächlich falsch. Die Funktion funktioniert nicht ordnungsgemäß, da darin undefiniertes Verhalten auftritt.

Der Compiler sieht, dass ein bestimmter Betrag in der Variablen r berücksichtigt wird. Ein Überlauf der Variablen r sollte nicht auftreten. Andernfalls handelt es sich um ein undefiniertes Verhalten, das der Compiler nicht berücksichtigen und berücksichtigen sollte. Da der Compiler in der Variablen r nach dem Ende des Zyklus nicht negativ sein kann, ist die Operation r & 0x7fffffff zum Zurücksetzen des Vorzeichenbits überflüssig und der Compiler gibt einfach den Wert der Variablen r von der Funktion zurück.

Diagnose V1026 wurde nur entwickelt, um solche Fehler zu erkennen. Um den Code zu korrigieren, reicht es aus, den Hash mit einer vorzeichenlosen Variablen zu lesen. Korrigierte Version des Codes:

 int foo(const unsigned char *s) { unsigned r = 0; while(*s) { r += ((r * 20891 + *s *200) | *s ^ 4 | *s ^ 3) ^ (r >> 1); s++; } return (int)(r & 0x7fffffff); } 

Schauen wir uns nun eine andere V1033- Diagnose an. Es ist insofern interessant, als die Ursache für mögliche Fehler das neue Auto- Schlüsselwort war, das in C ++ 11 erschien. Und nicht die Innovation der C ++ 11-Sprache selbst ist schuld, sondern die Nuancen des psychologischen Plans :). Ich werde es jetzt erklären. Schauen Sie sich diesen Code an:

 float d = 3.14f; int i = 1; auto sum = d + i; 

Sehen Sie es als Fehler? Denk darüber nach. Hier ist ein Bild, damit Sie den Text nicht sofort weiterlesen.

Zeit zum Nachdenken

Ratet mal, was falsch sein könnte? Wenn nicht, finden Sie hier weitere interessante Informationen. Die Summenvariable ist 4, nicht 4,14. Warum?

Xs

Jetzt wird der Leser sagen, dass es ein unehrliches Rätsel war! Die Sache ist, dass dies nicht C ++ ist, sondern C.

Es kommt vor, dass ein Projekt sowohl C ++ als auch das gute alte C verwendet. Der Programmierer gewöhnt sich an die Verwendung von Auto in C ++ und kann dieses Wort versehentlich in C verwenden. Aber es bedeutet dort etwas anderes:

auto

Definiert eine lokale Variable mit lokaler Lebensdauer. Das automatische Schlüsselwort verwendet die folgende Syntax:

 [auto] data-definition; 

Da die lokale Lebensdauer die Standardeinstellung für lokale Variablen ist, wird das Schlüsselwort auto äußerst selten verwendet.

Es stellt sich heraus, dass die variable Summe vom Typ int ist , und deshalb wird ihr Wert 4 sein.

Einhorn lacht

Obwohl der Fehler in einem Projekt, das eine Mischung aus C- und C ++ - Dateien verwendet, exotisch erscheint, ist er sehr einfach zu erstellen. Dementsprechend warnt PVS-Studio bei der Analyse von C-Dateien vor solchen verdächtigen Konstrukten.

Andere Innovationen


Es wurde die Möglichkeit hinzugefügt , Projekte für das Waf-Build- System zu überprüfen .

Wir entwickeln den Analysator weiter in Richtung eingebetteter Systeme. Diese Version bietet Unterstützung für die Projektüberprüfung für die GNU Arm Embedded Toolchain, den Arm Embedded GCC-Compiler.

Bei der Analyse von Projekten für den Visual C ++ - Compiler (cl.exe, vcxproj-Projekte für Visual Studio / Standalone) speichert der Analysebericht das Register jetzt in den Pfaden zu den überprüften Dateien. Verfeinerung von der Seite sieht einfacher aus als es wirklich ist. Bei der Vorverarbeitung von Dateien verdirbt der cl.exe-Compiler den Fall in Dateinamen. Und Sie müssen sie wieder im Analysegerät wiederherstellen.

Es wurde die Möglichkeit hinzugefügt, pvsconfig-Dateien von CLMonitor / Standalone unter Windows zu verwenden.

Für das Modul pvs-studio-analzyer / CMake wurde ein inkrementeller Analysemodus hinzugefügt. Das PVS-Studio CMake-Modul kann jetzt unter Windows für Projekte verwendet werden, die den Visual C ++ - Compiler (cl.exe) verwenden.

Unterstützung für inkrementelle Analysen für .NET Core / .NET Standard Visual Studio-Projekte hinzugefügt.

Sitelinks


  1. PVS-Studio. Versionsgeschichte .
  2. Andrey Karpov. Undefiniertes Verhalten ist näher als Sie denken .
  3. Will Dietz, Peng Li, John Regehr und Vikram Adve. Grundlegendes zum Integer-Überlauf in C / C ++ .
  4. Egor Bredikhin. Entwicklung eines neuen statischen Analysators: PVS-Studio Java .

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


All Articles