c++ code-coverage gcov

¿Cómo le digo a gcov que ignore las líneas de código C++ no hittables?



code-coverage (4)

¿Podría introducir pruebas unitarias de las funciones relevantes, que existen únicamente para cerrar gcov atacando directamente las rutas de código teóricamente no elegibles? Como son pruebas unitarias, quizás podrían ignorar la "imposibilidad" de las situaciones. Podrían llamar a las funciones que nunca se llaman, pasar valores enum no válidos para capturar ramas predeterminadas, etc.

Luego, ejecute esas pruebas solo en la versión de su código compilada con NDEBUG, o bien, ejecútelas en un arnés que pruebe que se active la afirmación, sea lo que sea que soporte su marco de prueba.

Sin embargo, me resulta un poco extraño que la especificación indique que el código debe estar allí, en lugar de la especificación que contiene los requisitos funcionales del código. En particular, significa que sus pruebas no están probando esos requisitos, que es una buena razón para mantener los requisitos funcionales. Personalmente, me gustaría modificar la especificación para decir, "si se llama con un valor enum inválido, la función no podrá assert . Las personas que llamen no llamarán a la función con un valor enum no válido en el modo de lanzamiento". O algo así.

Presumiblemente, lo que dice actualmente es que "todas las instrucciones de cambio deben tener un caso predeterminado". Pero eso significa que los estándares de codificación están interfiriendo con el comportamiento observable (al menos, observable bajo gcov) mediante la introducción de código muerto. Los estándares de codificación no deberían hacer eso, por lo que la especificación funcional debería tener en cuenta los estándares de codificación si es posible.

De lo #if !GCOV_BUILD , quizás pueda envolver el código que no se puede incluir en #if !GCOV_BUILD y crearlo por separado para beneficio de gcov. Esta versión fallará algunos requisitos, pero con la condición de que su análisis del código sea correcto, le da la confianza que desea que el banco de pruebas pruebe todo lo demás.

Editar: dices que estás usando un generador de código dudoso, pero también estás pidiendo una solución anotando el código fuente. Si está cambiando la fuente, ¿puede eliminar el código muerto en muchos casos? No es que cambiar la fuente generada sea ideal, pero las necesidades deben ...

Estoy usando gcov para medir la cobertura en mi código C ++. Me gustaría llegar al 100% de cobertura, pero me veo obstaculizado por el hecho de que hay algunas líneas de código que teóricamente no se pueden tocar (métodos que se deben implementar pero que nunca se llaman, ramas predeterminadas de instrucciones de switch , etc.). Cada una de estas ramas contiene una assert( false ); declaración, pero gcov todavía los marca como sin hit.

Me gustaría poder decirle a gcov que ignore estas ramas. ¿Hay alguna manera de darle esa información a gcov anotando el código fuente o mediante cualquier otro mecanismo?


No creo que esto sea posible. Gcov depende de gcc para generar código adicional para producir la salida de cobertura. GCov solo analiza los datos. Esto significa que Gcov no puede analizar el código mejor que gcc (y supongo que usas -Wall y has eliminado el código informado como inalcanzable).

Recuerde que las funciones reubicables se pueden invocar desde cualquier lugar, dlls o ejecutables potencialmente incluso externos, por lo que no hay forma de que el compilador sepa qué funciones reubicables no se llamarán o qué entrada pueden tener estas funciones.

Probablemente necesites usar alguna herramienta de análisis estático de facy para obtener la información que deseas.


Por favor use lcov. Oculta la complejidad de gcov, produce buenos resultados, permite una producción detallada por prueba, presenta un filtro de archivos sencillo y - ta-taa - marcadores de línea para líneas ya revisadas:

De geninfo (1):

Los siguientes marcadores son reconocidos por geninfo:

  • LCOV_EXCL_LINE
    • Las líneas que contienen este marcador serán excluidas.
  • LCOV_EXCL_START
    • Marca el comienzo de una sección excluida. La línea actual es parte de esta sección.
  • LCOV_EXCL_STOP
    • Marca el final de una sección excluida. La línea actual no es parte de esta sección.

Se puede usar una herramienta llamada gcovr para resumir la salida de gcov, y ( desde al menos la versión 3.4 ) es compatible con los mismos marcadores de exclusión que lcov.

De esta respuesta :

Los siguientes marcadores son reconocidos por geninfo:

  • LCOV_EXCL_LINE
    • Las líneas que contienen este marcador serán excluidas.
  • LCOV_EXCL_START
    • Marca el comienzo de una sección excluida. La línea actual es parte de esta sección.
  • LCOV_EXCL_STOP
    • Marca el final de una sección excluida. La línea actual no es parte de esta sección.

También puede reemplazar ''LCOV'' arriba con ''GCOV'' o ''GCOVR'' . Todos ellos trabajan.