La méthodologie d'analyse statique utilise différentes technologies. L'un d'eux est le prétraitement des fichiers juste avant leur analyse. Les fichiers prétraités sont créés par un compilateur qui s'exécute dans un mode de fonctionnement spécial. Malheureusement, ce mode n'est pas très bien testé, comme le montrent nos nombreuses années d'expérience dans le développement d'un analyseur de code statique. Dans cette note, je vais donner un exemple de bogue fraîchement trouvé 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 source des projets Open Source. Il s'agit d'une
contribution significative à la qualité des logiciels open source, à la publicité supplémentaire et aux tests d'analyseurs. Parfois, nous constatons des problèmes très inhabituels dans les compilateurs qui sont difficiles à faire du côté de l'analyseur. Ainsi, un collègue a récemment écrit un article "Le
fichier avec la directive 'import' (erreur interne du compilateur 'msc1.cpp') a cessé d'être analysé. Que dois-je faire? " Pour aider nos utilisateurs à résoudre un problème "étranger".
Et CSS?
Un bug tout aussi intéressant vient d'être trouvé par moi lors de la vérification d'un grand projet. Le compilateur Microsoft pour C / C ++ version 19.16.27027.1 (Visual Studio v15.9.9) a généré cette 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 extrait 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 visualisé le fragment, il est devenu clair que le compilateur s'est trompé lors du prétraitement du fichier, mais le code a été compilé avec succès. Un extrait de code CSS fait partie du littéral de chaîne du code C ++. Voici un exemple de code suffisant pour répéter 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'interfère pas avec la compilation réussie, mais, en même temps, une erreur se produit dans le mode de prétraitement (flag
/ P ).
C'est une vie tellement difficile pour les développeurs d'analyseurs statiques :). Il semble que PVS-Studio ne soit pas à blâmer, mais nous devons quand même faire face à des problèmes similaires. Cependant, ce n'est pas quelque chose de nouveau. D'autres cas similaires peuvent être trouvés dans l'article "
PVS-Studio et l'environnement hostile ".
Conclusion
Ce problème sera envoyé au traqueur de bogues officiel, mais une solution rapide au problème n'est guère possible. Par exemple, le problème avec la directive
#import que nous avons identifié il y a plusieurs mois, dont j'ai parlé au début, ne sera résolu que dans la prochaine version de Visual Studio. Parce que La sortie du nouveau Visual Studio 2019 aura lieu dans une semaine, très probablement, ce bug n'aura pas le temps d'être corrigé à cette date. Les utilisateurs de PVS-Studio sont également invités à utiliser la macro
PVS_STUDIO .

Si vous souhaitez partager cet article avec un public anglophone, veuillez utiliser le lien vers la traduction: Svyatoslav Razmyslov.
Comment le fragment de balisage CSS a cassé le compilateur C ++