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

Quadro 1

A metodologia de análise estática utiliza diferentes tecnologias. Um deles é o pré-processamento de arquivos imediatamente antes da análise. Arquivos pré-processados ​​são criados por um compilador que é executado em um modo especial de operação. Infelizmente, esse modo não é muito bem testado, como mostram nossos muitos anos de experiência no desenvolvimento de um analisador de código estático. Nesta nota, darei um exemplo de um bug recém-encontrado no compilador C ++ da Microsoft.

1. Introdução


Para demonstrar os recursos do analisador estático PVS-Studio, nossa equipe verifica o código fonte dos projetos de código aberto. Essa é uma contribuição significativa para a qualidade do software de código aberto, publicidade adicional e testes do analisador. Às vezes, encontramos problemas muito incomuns em compiladores que são difíceis de executar no lado do analisador. Assim, um colega escreveu recentemente um artigo "O arquivo com a diretiva 'import' (erro interno do compilador 'msc1.cpp') deixou de ser analisado. O que devo fazer? " Para ajudar nossos usuários a resolver um problema "estrangeiro".

E o CSS?


Um bug igualmente interessante foi encontrado por mim ao verificar um projeto grande. O compilador da Microsoft para C / C ++ versão 19.16.27027.1 (Visual Studio v15.9.9) produziu esse erro ao analisar vários arquivos:

fatal error C1021: invalid preprocessor command 'tooltiphint' 

Obviamente, essa não é uma diretiva de pré-processador, mas o que é? Este é um trecho de 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; } 

Após visualizar o fragmento, ficou claro que o compilador estava errado durante o pré-processamento do arquivo, mas o código foi compilado com êxito. Um trecho de código CSS faz parte da string literal do código C ++. Aqui está um código de amostra suficiente para repetir 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 interfere na compilação bem-sucedida, mas, ao mesmo tempo, ocorre um erro no modo de pré-processamento (sinalizador / P ).

Essa é uma vida difícil para desenvolvedores de analisadores estáticos :). Parece que o PVS-Studio não é o culpado, mas ainda devemos lidar com problemas semelhantes. No entanto, isso não é algo novo. Outros casos semelhantes podem ser encontrados no artigo " PVS-Studio e o ambiente hostil ".

Conclusão


Esse problema será enviado ao rastreador oficial de erros, mas uma solução rápida para o problema é quase impossível. Por exemplo, o problema com a diretiva #import que identificamos vários meses atrás, sobre a qual escrevi no início, será corrigido apenas na próxima versão do Visual Studio. Porque O lançamento do novo Visual Studio 2019 ocorrerá em uma semana, provavelmente, esse bug não será corrigido até essa data. Usuários do PVS-Studio também são aconselhados a usar a macro PVS_STUDIO .



Se você deseja compartilhar este artigo com um público que fala inglês, use o link para a tradução: Svyatoslav Razmyslov. Como o fragmento de marcação CSS quebrou o compilador C ++

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


All Articles