Cómo el fragmento de marcado CSS rompió el compilador de C ++

Imagen 1

La metodología de análisis estático utiliza diferentes tecnologías. Uno de ellos es el preprocesamiento de archivos inmediatamente antes de su análisis. Los archivos preprocesados ​​son creados por un compilador que se ejecuta en un modo especial de operación. Desafortunadamente, este modo no está muy bien probado, como lo demuestran nuestros muchos años de experiencia en el desarrollo de un analizador de código estático. En esta nota, daré un ejemplo de un error recién encontrado en el compilador de C ++ de Microsoft.

Introduccion


Para demostrar las capacidades del analizador estático PVS-Studio, nuestro equipo verifica el código fuente de los proyectos de código abierto. Esta es una contribución significativa a la calidad del software de código abierto, publicidad adicional y pruebas de analizadores. A veces encontramos problemas muy inusuales en los compiladores que son difíciles de hacer en el lado del analizador. Entonces, un colega recientemente escribió un artículo "El archivo con la directiva 'import' (error interno del compilador 'msc1.cpp') ha dejado de analizarse. ¿Qué debo hacer? " Para ayudar a nuestros usuarios a resolver un problema "extraño".

¿Qué hay de CSS?


Acabo de encontrar un error igualmente interesante al revisar un proyecto grande. El compilador de Microsoft para C / C ++ versión 19.16.27027.1 (Visual Studio v15.9.9) produjo este error al analizar varios archivos:

fatal error C1021: invalid preprocessor command 'tooltiphint' 

Obviamente, esta no es una directiva de preprocesador, pero ¿qué es? Este es un fragmento 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; } 

Después de ver el fragmento, quedó claro que el compilador se equivocó durante el preprocesamiento del archivo, pero el código se compiló con éxito. Un fragmento de código CSS es parte del literal de cadena del código C ++. Aquí hay un código de muestra suficiente para repetir el error:

 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>)<<<"; 

El fragmento de código anterior no interfiere con la compilación exitosa, pero, al mismo tiempo, se produce un error en el modo de preprocesamiento (bandera / P ).

Esta es una vida tan difícil para los desarrolladores de analizadores estáticos :). Parece que PVS-Studio no tiene la culpa, pero aún así debemos tratar con problemas similares. Sin embargo, esto no es algo nuevo. Se pueden encontrar otros casos similares en el artículo " PVS-Studio y el entorno hostil ".

Conclusión


Este problema se enviará al rastreador de errores oficial, pero una solución rápida al problema es casi imposible. Por ejemplo, el problema con la directiva #import que identificamos hace varios meses, sobre el que escribí al principio, solo se solucionará en la próxima versión de Visual Studio. Porque El lanzamiento del nuevo Visual Studio 2019 tendrá lugar en una semana, lo más probable es que este error no se solucione en esta fecha. También se recomienda a los usuarios de PVS-Studio que usen la macro PVS_STUDIO .



Si desea compartir este artículo con una audiencia de habla inglesa, utilice el enlace a la traducción: Svyatoslav Razmyslov. Cómo el fragmento de marcado CSS rompió el compilador de C ++

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


All Articles