2010-08-08 7 views
10

Estoy experimentando con gcov usando mingw gcc 4.4.0. He estado obteniendo algunos resultados interesantes pero extraños. Un patrón común es algo como esto ...¿Cómo puedo obtener resultados más precisos de gcov?

 5162: 66: std::string::iterator i = l_Temp.begin(); 
    5162: 67: std::string::iterator j = l_Temp.end() - 1; 
     -: 68: char ch; 
     -: 69: 
    20564: 70: while (i < j) 
     -: 71: { 
    10240: 72: ch = *i; *i = *j; *j = ch; i++; j--; 
     -: 73: } 
     -: 74: 
    #####: 75: return l_Temp; 
     -: 76:} 

¿Cómo puede no ser que return exected en absoluto, dado que el bucle justo antes de que claramente es a la vez la ejecución y salir? Creo que soy una víctima de la optimización del valor de retorno aquí, dado que esta variable temporal es del tipo std::string.

El problema es que ya estoy especificando -O0 en las opciones del compilador. Estas son las opciones del compilador exactas que estoy usando ...

-Wno-invalid-offsetof -g -O0 -fprofile-arcs -ftest-coverage 

Mi mejor conjetura es que no todas las optimizaciones están desactivados por -O0 después de todo. Puedo comenzar a buscar indicadores de optimización específicos uno por uno cuando noto problemas, pero esto parece algo extraño que debo hacer.

Entonces, ¿qué indicadores debería Especifico para obtener resultados de cobertura seguros de gcov?

EDITAR

Hasta el momento, creo que necesito las siguientes opciones adicionales ...

  • -fno-default-inline
  • -fno-inline

No estoy seguro de que ambos sean necesarios, aunque creo que cada uno desactiva un tipo específico diferente de línea.

No he encontrado ninguna forma de deshabilitar las optimizaciones del valor de retorno. Este no es un gran problema, pero es un poco molesto. Cuando se apunta a una cobertura del 100%, algunos archivos que realmente alcanzan el 100% serán reportados como menos debido a este problema. Un grep puede encontrar los marcadores ##### y mostrar si son para las declaraciones return, pero aún necesita hacer una inspección visual para verificar que el problema sea puramente un RVO.

+2

¿Agregar -fno-elide-constructors ayuda a alguno? – Mat

+0

@Mat - Lo verificaré, pero estoy ocupado hoy – Steve314

+0

Tal vez su función esté en línea. Intenta compilar con -O0. – whoplisp

Respuesta

3

Como se sugiere en el comentario de Mat, la opción -fno-elide-constructors soluciona este problema.

Respondió esta pregunta para cerrar esta pregunta ya antigua. Si Mat publica una respuesta, la borraré y cambiaré la opción aceptar.

Cuestiones relacionadas