Erro com a diretiva #line no compilador Visual C ++

image1.png

A diretiva #line é adicionada pelo pré-processador e, em seguida, pode ser usada para entender a qual arquivo e linha uma parte específica do código no arquivo pré-processado pertence. A diretiva #line informa às ferramentas de código para alterar o número da linha interna armazenada e o nome do arquivo do compilador para o número da linha especificado. As linhas a seguir já contam em relação à posição especificada. O pré-processamento explícito é usado principalmente para depuração ou por vários geradores. De qualquer forma, um erro nessa funcionalidade pode levar a várias consequências negativas. Um desses problemas ocorreu ao usuário do PVS-Studio no Visual Studio 2019.

Histórico e descrição de erros


A diretiva #line é uma parte importante dos arquivos pré-processados ​​usados ​​pelo analisador PVS-Studio para emitir avisos nas linhas necessárias do código do usuário. É aqui que a história da pesquisa de erros começa.

Um de nossos usuários com uma grande base de código iniciou a tradução de todo o projeto da Platform Toolset versão v141 para v142 no Visual Studio 2019. Depois disso, nos resultados da análise, uma onda de avisos V002 apareceu e várias dezenas de outros avisos foram emitidos para as linhas de código incorretas (erro de uma linha )

O Diagnostics V002 apenas detecta essas situações (numeração de linha incorreta). Isso geralmente ocorre devido a macros de várias linhas ou outras diretivas de pré-processador (por exemplo, #pragma). O problema não ocorre com muita frequência, mas principalmente em um compilador da Microsoft. Essa onda de problemas em um projeto foi inesperada, porque nosso sistema de teste não mostrou a presença de um problema tão sério e começamos a depurar o analisador no arquivo de usuário pré-processado.

Após algumas horas de depuração, descobrimos que o analisador já estava trabalhando com dados incorretos sobre linhas de código e pudemos fazer um exemplo de teste:

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

O arquivo pré-processado é o seguinte:

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

A declaração de retorno está na linha do arquivo de origem e o pré-processador aponta para a linha. Este erro ocorreu no pré-processador, provavelmente devido a uma macro de várias linhas.

Versão Lançada


No momento da redação deste artigo, o problema era relevante para as versões mais recentes do Visual Studio, até a versão 16.4.3 (14 de janeiro de 2020). Abrimos o relatório de erros " Diretiva de linha # inválida após o pré-processamento (VS2019, v142) " e após 4 dias recebemos uma resposta interessante:

Esse problema foi identificado como uma duplicata de um feedback relatado anteriormente, vinculado aqui: developercommunity.visualstudio.com/content/problem /738407/preprocessor-generates-incorrect-line-information.html . Se você denunciou ou votou aqui, seu voto foi aplicado à questão original. Todos os outros podem adicionar seu voto diretamente no feedback vinculado acima. A votação ajuda a aumentar a prioridade do problema, consolidando o impacto do cliente em um único feedback. Obrigado!

Acontece que esse problema já foi relatado e, em 18 de setembro de 2019 - quase meio ano atrás: "O pré-processador gera informações de linha incorretas ". O usuário forneceu exemplos de código semelhantes para reproduzir o erro. Segundo o autor, o erro existe pelo menos no Visual Studio 2019 16.2.

Não se sabe se isso é uma coincidência ou não, mas após alguns dias de nossa atividade, o erro recebeu o status Corrigido - Liberação pendente .

Em 19 de maio de 2020, uma versão revisada do Visual Studio 2019 16.6.0 foi lançada. Recomendamos que todos os usuários do PVS-Studio alternem para ele.


Se você deseja compartilhar este artigo com um público que fala inglês, use o link para a tradução: Svyatoslav Razmyslov. Um erro causado pela diretiva #line no compilador Visual C ++ .

All Articles