Comment le fragment de balisage CSS a cassé le compilateur C ++

Image 1

La méthodologie d'analyse statique fait appel à diverses technologies. L'un d'eux est le prétraitement des fichiers juste avant de les analyser. Les fichiers préparés sont créés par le compilateur qui s'exécute dans un mode de travail spécial. Malheureusement, notre longue expérience dans le développement d'un analyseur statique montre que ce mode n'est pas idéal pour les tests. Dans cette note, je vais donner l'exemple d'un nouveau bogue dans le compilateur C ++ de Microsoft.

Présentation


Pour démontrer les capacités de l'analyseur statique PVS-Studio, notre équipe vérifie le code des projets open source. Il s'agit d'une contribution importante à la qualité des logiciels open source, à la publicité supplémentaire et aux tests de l'analyseur. Parfois, nous révélons des problèmes très inhabituels dans les compilateurs, qui sont difficiles à traiter de la part de l'analyseur. Ainsi, mon collègue a récemment écrit l'article " Le fichier avec la directive 'import' ne fonctionne plus (erreur interne du compilateur 'msc1.cpp'). Que devons-nous faire? " Pour aider nos utilisateurs à résoudre le problème de "quelqu'un d'autre" .

Quel est le lien avec CSS?


Je viens de trouver un bug non moins intéressant lors de la vérification d'un grand projet. Le compilateur Microsoft pour C / C ++ de la version 19.16.27027.1 (Visual Studio v15.9.9) vient de générer une telle erreur lors de l'analyse de plusieurs fichiers:

fatal error C1021: invalid preprocessor command 'tooltiphint' 

Évidemment, ce n'est pas une directive de préprocesseur, mais qu'est-ce que c'est? Ceci est un fragment de code CSS:

 #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; } 

Après avoir examiné de près le fragment, il est devenu clair que le compilateur se trompe lors du prétraitement du fichier, alors que le code est compilé avec succès. Le fragment du code CSS fait partie du littéral de chaîne de code C ++. Voici l'exemple de code, suffisant pour reproduire l'erreur:

 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>)<<<"; 

Le fragment de code ci-dessus n'empêche pas la compilation réussie mais, en même temps, une erreur se produira dans le mode de prétraitement (indicateur / P ).

Comme vous pouvez le voir, la vie des développeurs d'analyseurs statiques est tout sauf simple :). Il semble que PVS-Studio n'est pas à blâmer, mais nous devons encore faire face à de tels problèmes. Eh bien, pas de nouvelles fraîches. Vous pouvez consulter d'autres cas similaires dans l'article " PVS-Studio et environnement hostile ".

Conclusion


Ce problème sera envoyé au bug-tracker officiel, mais une solution rapide du problème n'est guère possible. Par exemple, le problème avec la directive #import , mentionné au début, que nous avons détecté il y a plusieurs mois, ne sera résolu que dans la prochaine version de Visual Studio. Étant donné que la sortie du nouveau Visual Studio 2019 aura lieu dans une semaine, ils ne parviendront probablement pas à résoudre ce bogue à cette date. Utilisateurs de PVS-Studio, nous vous recommandons d'utiliser également la macro PVS_STUDIO .

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


All Articles