¿Cuál es la mejor forma de encontrar plantillas desinstaladas en C++ Code?Encontrar plantillas no creadas en el código C++
Tengo una base de código que usa muchas plantillas. Por supuesto, queremos asegurarnos de que la cobertura de la prueba sea alta. Para todos los códigos usados, esto funciona muy bien usando gcov
.
Sin embargo, las plantillas no utilizadas se informan como no ejecutables por gcov
.
Después de algunas google, parece que no hay manera de forzar g++
para emitir código para estas plantillas (lo cual es lógico, ¿cómo debería el compilador adivinar cualquier tipo?) También parece que no hay manera de hacer gcov reconoce el código de plantilla desinstalado como código ejecutable.
¿Hay algo "listo para usar" que me permita aumentar los archivos generados por la instrumentación GCC -ftest-coverage -fprofile-arcs
? Por el gcov option documentation of GCC, probablemente sería suficiente marcar todo el cuerpo de la función de la plantilla como un bloque, ya que la ejecución nunca terminará allí.
EDIT (información de fondo): Estoy trabajando en una biblioteca de plantillas de solo encabezado. Mi objetivo aquí es encontrar funciones no utilizadas/no probadas.
Sé que la cobertura del código es defectuosa, pero encontrar el código desinstalado es un paso muy importante hacia un código mejor probado. Actualmente, estamos poniendo macros de punto de control al comienzo de cada función. En el modo de prueba, se expanden al código que inserta un par de (file, line)
en un conjunto global de puntos de control pasados. Después de ejecutar las pruebas, leemos todos los archivos de forma manual y comparamos los puntos de control alcanzados con el conjunto de todos los puntos de control disponibles.
Encontrar el código desinstalado es importante, por ejemplo, debido a un comportamiento de precedencia de plantilla C++ poco intuitivo, puede haber un código muerto en alguna parte que el lector o incluso el autor esperarían usar.
¿Quiere decir clases de plantilla/estructuras/funciones que nunca se instancian para ningún tipo? – Xeo
@Xeo: Sí, esto es lo que quiero decir. – Manuel
No estoy seguro de que lo que estás pidiendo tenga sentido para mí. El compilador solo crea una instancia de la plantilla para los tipos utilizados. Si algún tipo dado nunca se usa para esa plantilla, esa instanciación particular no existirá en el nivel del código del objeto. – greatwolf