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)
int main(int argc, char* argv[])
{
MACRO("Some string",
42);
return 0;
}
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 7ª linha do arquivo de origem e o pré-processador aponta para a 8ª 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 ++ .