A metodologia de análise estática envolve várias tecnologias. Um deles é o pré-processamento de arquivos antes de analisá-los. Os arquivos preparados são criados pelo compilador que é executado em um modo de trabalho especial. Infelizmente, nossa experiência de longa data no desenvolvimento de um analisador estático mostra que esse modo não é ótimo para testes. Nesta nota, darei o exemplo de um novo bug no compilador C ++ da Microsoft.
1. Introdução
Para demonstrar as capacidades do analisador estático PVS-Studio, nossa equipe verifica o código dos projetos de código aberto. Essa é uma
contribuição significativa para a qualidade do software de código aberto, publicidade extra e teste do analisador. Às vezes, revelamos alguns problemas incomuns nos compiladores, difíceis de lidar por parte do analisador. Assim, meu colega escreveu recentemente o artigo "
O arquivo com a diretiva 'import' não está mais funcionando (erro interno do compilador 'msc1.cpp'). O que devemos fazer? " Para ajudar nossos usuários a resolver o problema de "outra pessoa" .
O que há de conexão com CSS?
Acabei de encontrar um bug não menos interessante ao verificar um projeto grande. O compilador da Microsoft para C / C ++ da versão 19.16.27027.1 (Visual Studio v15.9.9) acaba de emitir esse erro ao analisar vários arquivos:
fatal error C1021: invalid preprocessor command 'tooltiphint'
Obviamente, não é uma diretiva de pré-processador, mas o que é? Este é um fragmento do código 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; }
Depois de examinar atentamente o fragmento, ficou claro que o compilador comete um erro ao pré-processar o arquivo, enquanto o código é compilado com êxito. O fragmento do código CSS faz parte da cadeia de caracteres do código C ++. Aqui está o exemplo de código, suficiente para reproduzir o erro:
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>)<<<";
O fragmento de código acima não impede a compilação bem-sucedida, mas, ao mesmo tempo, ocorrerá um erro no modo de pré-processamento (sinalizador
/ P ).
Como você pode ver, a vida dos desenvolvedores de analisadores estáticos é tudo menos simples :). Parece que o PVS-Studio não é o culpado, mas ainda temos que lidar com esses problemas. Bem, nenhuma novidade. Você pode conferir outros casos semelhantes no artigo "
PVS-Studio e Hostile Environment ".
Conclusão
Esse problema será enviado ao rastreador de erros oficial, mas uma solução rápida do problema é quase impossível. Por exemplo, o problema com a diretiva
#import , mencionada no início, detectada há vários meses, será corrigida apenas na próxima versão do Visual Studio. Como o lançamento do novo Visual Studio 2019 será em uma semana, provavelmente eles não conseguirão corrigir esse bug até essa data. Usuários do PVS-Studio, recomendamos que você também use a macro
PVS_STUDIO .