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.
¿Agregar -fno-elide-constructors ayuda a alguno? – Mat
@Mat - Lo verificaré, pero estoy ocupado hoy – Steve314
Tal vez su función esté en línea. Intenta compilar con -O0. – whoplisp