Error con la directiva #line en el compilador de Visual C ++

image1.png

La directiva #line es agregada por el preprocesador y luego se puede usar para comprender a qué archivo y línea pertenece un determinado código en el archivo preprocesado. La directiva #line le dice a las herramientas de código que cambien el número de línea interno almacenado y el nombre del archivo compilador al número de línea especificado. Las siguientes líneas ya contarán en relación con la posición dada. El preprocesamiento explícito se utiliza principalmente para la depuración o por varios generadores. En cualquier caso, un error en dicha funcionalidad puede tener varias consecuencias negativas. Uno de estos problemas ocurrió al usuario de PVS-Studio en Visual Studio 2019.

Historial de errores y descripción


La directiva #line es una parte importante de los archivos preprocesados ​​que utiliza el analizador PVS-Studio para emitir advertencias en las líneas necesarias de código de usuario. Aquí es donde comienza la historia de la búsqueda de errores.

Uno de nuestros usuarios con una gran base de código comenzó la traducción de todo el proyecto de Platform Toolset versión v141 a v142 en Visual Studio 2019. Después de eso, en los resultados del análisis, apareció una oleada de advertencias V002 y se emitieron varias decenas de otras advertencias a las líneas de código incorrectas (un error de línea )

Diagnostics V002 solo detecta tales situaciones (numeración de línea incorrecta). Esto generalmente ocurre debido a macros de varias líneas u otras directivas de preprocesador (por ejemplo, #pragma). El problema no ocurre con mucha frecuencia, sino principalmente en un compilador de Microsoft. Tal aumento de problemas en un proyecto fue inesperado, porque nuestro sistema de prueba no mostró la presencia de un problema tan grave, y comenzamos a depurar el analizador en el archivo de usuario preprocesado.

Después de algunas horas de depuración, descubrimos que el analizador ya estaba trabajando con datos incorrectos sobre líneas de código y pudimos hacer un ejemplo de prueba:

#define MACRO(a, b)              // line1
                                 // line2
int main(int argc, char* argv[]) // line3
{                                // line4
    MACRO("Some string",         // line5
        42);                     // line6
    return 0;                    // line7 <=
}

El archivo preprocesado es el siguiente:

#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;
}

La declaración de retorno se encuentra en la séptima línea del archivo fuente y el preprocesador apunta a la octava línea. Este error ocurrió en el preprocesador, presumiblemente debido a una macro multilínea.

Lanzamiento de la versión lanzada


En el momento de escribir este artículo, el problema era relevante para las últimas versiones de Visual Studio, hasta la versión 16.4.3 (con fecha 14 de enero de 2020). Abrimos el informe de error " Directiva de línea # no válida después del preprocesamiento (VS2019, v142) " y después de 4 días recibimos una respuesta interesante:

este problema se identificó como un duplicado de un comentario informado anteriormente vinculado aquí: developercommunity.visualstudio.com/content/problem /738407/preprocessor-generates-incorrect-line-information.html . Si informó o votó aquí, su voto se ha aplicado al problema original. Todos los demás pueden agregar su voto directamente a los comentarios vinculados anteriormente. La votación ayuda a aumentar la prioridad del problema al consolidar el impacto del cliente en un solo comentario. ¡Gracias!

Resulta que este problema ya se ha informado, y el 18 de septiembre de 2019 , hace casi medio año: "El preprocesador genera información de línea incorrecta ". El usuario proporcionó ejemplos de código similares para reproducir el error. Según el autor, el error existe al menos con Visual Studio 2019 16.2.

No se sabe si esto es una coincidencia o no, pero después de unos días de nuestra actividad, al error se le asignó el estado Reparado - Publicación pendiente .

El 19 de mayo de 2020, se lanzó una versión revisada de Visual Studio 2019 16.6.0. Recomendamos que todos los usuarios de PVS-Studio lo cambien.


Si desea compartir este artículo con una audiencia de habla inglesa, utilice el enlace a la traducción: Svyatoslav Razmyslov. Un error causado por la directiva #line en el compilador de Visual C ++ .

All Articles