Erreur avec la directive #line dans le compilateur Visual C ++

image1.png

La directive #line est ajoutée par le préprocesseur et peut ensuite être utilisée pour comprendre à quel fichier et à quelle ligne un morceau de code particulier dans le fichier prétraité appartient. La directive #line indique aux outils de code de changer le numéro de ligne stocké interne et le nom du fichier du compilateur par le numéro de ligne spécifié. Les lignes suivantes compteront déjà par rapport à la position donnée. Le prétraitement explicite est principalement utilisé pour le débogage ou par divers générateurs. Dans tous les cas, une erreur dans une telle fonctionnalité peut entraîner diverses conséquences négatives. Un de ces problèmes s'est produit pour l'utilisateur de PVS-Studio dans Visual Studio 2019.

Historique et description des erreurs


La directive #line est une partie importante des fichiers prétraités qui sont utilisés par l'analyseur PVS-Studio pour émettre des avertissements sur les lignes de code utilisateur nécessaires. C'est là que commence l'histoire de la recherche d'erreur.

Un de nos utilisateurs disposant d'une grande base de code a commencé la traduction de l'intégralité du projet de Platform Toolset version v141 à v142 dans Visual Studio 2019. Après cela, dans les résultats de l'analyse, une vague d'avertissements V002 est apparue et plusieurs dizaines d'autres avertissements ont été émis vers les mauvaises lignes de code (erreur d'une ligne )

Diagnostics V002 ne détecte que de telles situations (numérotation des lignes incorrecte). Cela se produit généralement en raison de macros multi-lignes ou d'autres directives de préprocesseur (par exemple #pragma). Le problème ne se produit pas très souvent, mais principalement sur un compilateur de Microsoft. Une telle vague de problèmes sur un projet était inattendue, car notre système de test n'a pas montré la présence d'un problème aussi grave, et nous avons commencé à déboguer l'analyseur sur le fichier utilisateur prétraité.

Après quelques heures de débogage, nous avons constaté que l'analyseur fonctionnait déjà avec des données incorrectes sur les lignes de code et avons pu faire un exemple de test:

#define MACRO(a, b)              // line1
                                 // line2
int main(int argc, char* argv[]) // line3
{                                // line4
    MACRO("Some string",         // line5
        42);                     // line6
    return 0;                    // line7 <=
}

Le fichier prétraité est le suivant:

#line 1 "D:\\_Tests\\TestApp\\Project2\\rnd_bs.cpp"


int main(int argc, char* argv[])
{
  ;
#line 8 "D:\\_Tests\\TestApp\\Project2\\rnd_bs.cpp"
  return 0;
}

L' instruction de retour se trouve sur la 7e ligne du fichier source et le préprocesseur pointe vers la 8e ligne. Cette erreur s'est produite dans le préprocesseur, probablement en raison d'une macro multiligne.

Sortie de la version publiée


Au moment de la rédaction, le problème était pertinent pour les dernières versions de Visual Studio, jusqu'à la version 16.4.3 (datée du 14 janvier 2020). Nous avons ouvert le rapport de bogue " Directive #line non valide après le prétraitement (VS2019, v142) " et après 4 jours , nous avons reçu une réponse intéressante:

Ce problème a été identifié comme un doublon d'un retour d'informations précédemment signalé lié ici: developercommunity.visualstudio.com/content/problem /738407/preprocessor-generates-incorrect-line-information.html . Si vous avez signalé ou voté ici, votre vote a été appliqué au problème d'origine. Tout le monde peut ajouter son vote directement aux commentaires liés ci-dessus. Le vote permet d'augmenter la priorité du problème en consolidant l'impact client sous un seul feedback. Je vous remercie!

Il s'avère que ce problème a déjà été signalé, et le 18 septembre 2019 - il y a presque six mois: "Le préprocesseur génère des informations de ligne incorrectes ". L'utilisateur a fourni des exemples de code similaires pour reproduire l'erreur. Selon l'auteur, l'erreur existe au moins avec Visual Studio 2019 16.2.

On ne sait pas si c'est une coïncidence ou non, mais après quelques jours de notre activité, l'erreur a reçu le statut Fixe - En attente de libération .

Le 19 mai 2020, une version révisée de Visual Studio 2019 16.6.0 a été publiée. Nous recommandons que tous les utilisateurs de PVS-Studio y basculent.


Si vous souhaitez partager cet article avec un public anglophone, veuillez utiliser le lien vers la traduction: Svyatoslav Razmyslov. Un bogue provoqué par la directive #line dans le compilateur Visual C ++ .

All Articles