2011-04-25 13 views
7

¿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.

+0

¿Quiere decir clases de plantilla/estructuras/funciones que nunca se instancian para ningún tipo? – Xeo

+0

@Xeo: Sí, esto es lo que quiero decir. – Manuel

+2

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

Respuesta

1

Bien, ya que no soy muy versado con GCC, aquí hay una solución tediosa y muy lenta, ¡pero al menos funciona! :)
Esta prueba se basa en el hecho de que algunos errores en el código de plantilla no se detectan hasta que ejemplificación real, es decir, cuando los nombres dependientes no existen realmente en el parámetro de plantilla:

template<class T> 
struct Example{ 
    typedef typename T::_123344_non_existent_type instantiation_test; 
}; 

Añadir un typedef tales a cada plantilla que tienes, luego compila. Quítelo de cada estructura/clase/función para la que el compilador muestra un error y cada plantilla que todavía contiene dicho tipodef cuando el código finalmente se compila, nunca se crea una instancia. O tiene mala suerte y algunos tipos definen un _123344_non_existent_type, aunque lincharé al compañero de trabajo que es responsable de eso. ;)

+0

Si bien es factible, esto es igualmente intensivo en trabajo como mantener el enfoque de macro de punto de control que describí anteriormente en mi edición. – Manuel

+0

@Manuel: Sí, lo dije en la primera oración. ;) Lo siento, pero no estaba en línea cuando editó su pregunta. ^^ – Xeo

+0

@Manuel: en realidad es peor, si reelabora su suite de pruebas, debe comenzar de cero, ya que había eliminado previamente el 'typedef' de aquellos casos en los que trabajó. –

2

Creo que nuestra herramienta C++ Test Coverage (no basada en GCC) lo hace correctamente desde su punto de vista.

Funciona con el código fuente antes de lo ve el compilador; el código dentro de las plantillas obtiene "sondeos de cobertura" independientemente de si la plantilla se usa o no. La parte de visualización de cobertura de prueba de la herramienta sabe dónde están todas las sondas; si no se crea una instancia del código de la plantilla, claramente no se puede ejecutar, eso es lo que se informará. No tiene que hacer ninguna macro inserción "personalizada" u otra, por ejemplo, BS.

El inconveniente es que si tiene una plantilla parametrizada por varios tipos diferentes, y el método de plantilla m1 y m2 se ejecutan para diferentes tipos de instancia, su cobertura para m1 y m2 será del 100% (después de todo, ejecutó el instrumentado modelo). No está claro que esto sea malo; solo que así es como se interpreta esto.

Cuestiones relacionadas