Como o fragmento de marcação CSS quebrou o compilador C ++

Quadro 1

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 .

Source: https://habr.com/ru/post/pt445496/


All Articles