Die statische Analysemethode umfasst verschiedene Technologien. Eine davon ist die Vorverarbeitung von Dateien unmittelbar vor deren Analyse. Vorbereitete Dateien werden vom Compiler erstellt, der in einem speziellen Arbeitsmodus ausgeführt wird. Leider zeigt unsere langjährige Erfahrung mit der Entwicklung eines statischen Analysators, dass dieser Modus nicht zum Testen geeignet ist. In diesem Hinweis werde ich das Beispiel eines neuen Fehlers im C ++ - Compiler von Microsoft geben.
Einführung
Um die Funktionen des statischen Analysators PVS-Studio zu demonstrieren, überprüft unser Team den Code von Open Source-Projekten. Dies ist ein wesentlicher
Beitrag zur Qualität von Open Source-Software, zur zusätzlichen Publizität und zum Testen des Analysators. Manchmal stellen wir einige sehr ungewöhnliche Probleme bei Compilern fest, die für den Analysator schwer zu lösen sind. Daher hat mein Kollege kürzlich den Artikel "
Die Datei mit der Direktive 'import' funktioniert nicht mehr (interner Compilerfehler 'msc1.cpp') geschrieben. Was sollen wir tun? ", Um unseren Benutzern bei der Lösung des Problems "eines anderen" zu helfen .
Was ist Verbindung mit CSS?
Ich habe gerade einen nicht weniger interessanten Fehler beim Überprüfen eines großen Projekts gefunden. Der Microsoft-Compiler für C / C ++ der Version 19.16.27027.1 (Visual Studio v15.9.9) hat gerade einen solchen Fehler bei der Analyse mehrerer Dateien ausgegeben:
fatal error C1021: invalid preprocessor command 'tooltiphint'
Offensichtlich ist es keine Präprozessor-Direktive, aber was ist das? Dies ist ein Fragment des CSS-Codes:
#tooltiphint { position: fixed; width: 50em; margin-left: -25em; left: 50%; padding: 10px; border: 1px solid #b0b0b0; border-radius: 2px; box-shadow: 1px 1px 7px black; background-color: #c0c0c0; z-index: 2; }
Bei genauerer Betrachtung des Fragments wurde klar, dass der Compiler bei der Vorverarbeitung der Datei einen Fehler macht, während der Code erfolgreich kompiliert wird. Das Fragment des CSS-Codes ist Teil des C ++ - Codezeichenfolgenliteral. Hier ist das Beispiel eines Codes, das ausreicht, um den Fehler zu reproduzieren:
std::string test = R"<<<( <style type="text/css"> body { color:#000000; background-color:#ffffff } body { font-family:Helvetica, sans-serif; font-size:10pt } #tooltiphint { position: fixed; width: 50em; margin-left: -25em; left: 50%; padding: 10px; border: 1px solid #b0b0b0; border-radius: 2px; box-shadow: 1px 1px 7px black; background-color: #c0c0c0; z-index: 2; } .macro { color: darkmagenta; background-color:LemonChiffon; /* Macros are position: relative to provide base for expansions. */ position: relative; } </style> </head> <body>)<<<";
Das obige Codefragment verhindert nicht die erfolgreiche Kompilierung, aber gleichzeitig tritt im Vorverarbeitungsmodus (
/ P- Flag) ein Fehler auf.
Wie Sie sehen können, ist das Leben der Entwickler von statischen Analysatoren alles andere als einfach :). Es scheint, dass PVS-Studio nicht schuld ist, aber wir müssen uns immer noch mit solchen Problemen befassen. Nun, keine neuen Nachrichten. Weitere ähnliche Fälle finden Sie im Artikel "
PVS-Studio und feindliche Umgebung ".
Fazit
Dieses Problem wird an den offiziellen Bug-Tracker gesendet, eine schnelle Lösung des Problems ist jedoch kaum möglich. Das zu Beginn erwähnte Problem mit der
# import- Direktive, das wir vor einigen Monaten festgestellt haben, wird beispielsweise erst in der nächsten Visual Studio-Version behoben. Da die Veröffentlichung des neuen Visual Studio 2019 in einer Woche erfolgen wird, wird es höchstwahrscheinlich nicht gelingen, diesen Fehler bis zu diesem Datum zu beheben. Benutzern von PVS-Studio empfehlen wir, auch das Makro
PVS_STUDIO zu verwenden .