Identificación de código muerto (C++)


Tengo un gran proyecto heredado de C++ compilado bajo Visual Studio 2008. Sé que hay una cantidad razonable de código 'muerto' al que no se accede en ninguna parte methods métodos que no se llaman, clases enteras que no se utilizan.

Estoy buscando una herramienta que identifique esto mediante análisis estático.

Esta pregunta: La detección de código muerto en el proyecto C/C++ heredado sugiere el uso de herramientas de cobertura de código. Esta no es una opción, ya que la cobertura de la prueba no es lo suficientemente alta.

También menciona un-Wunreachable-code. opción a gcc. Me gustaría algo similar para Visual Studio. Ya usamos la opción /OPT:REF del enlazador para eliminar código redundante, pero esto no reporta el código muerto a un nivel útil (cuando se usa con /VERBOSE hay más de 100,000 líneas, incluyendo muchas de las bibliotecas).

¿Hay alguna opción mejor que funcione bien con un proyecto de Visual Studio?

Author: Community, 2008-11-26

7 answers

Usted querrá algo como QA-C++ ( http://www.programmingresearch.com/QACPP_MAIN.html ), véase también http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis para productos similares.

Está buscando una herramienta de análisis de código estático que detecte código inalcanzable; muchas pautas de codificación (como MISRA-C++, si no me equivoco) requieren que no exista código inalcanzable. Una herramienta de análisis orientada específicamente a hacer cumplir dicha directriz sería tu mejor apuesta.

Y te gustará poder encontrar otros usos para la herramienta también.

 6
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-26 16:37:53

Sé que los productos Lint de Gimpel ( PC-Lint y Flexelint) identificarán el código inalcanzable y los módulos no utilizados / no referenciados.

Ambos caen en la categoría de herramientas de análisis estático.

No tengo ninguna afiliación con Gimpel, solo un cliente satisfecho a largo plazo.

 8
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-30 20:15:43

No conozco Visual C, y también había recomendado las herramientas de cobertura específicas-Wunreachable-code. Como solución para su situación, intentaría lo siguiente:

  1. Haga con ctags (o programa similar) una lista de todos sus símbolos en su fuente
  2. Habilite en su compilador la eliminación de código muerto (asumiría que por defecto está activado)
  3. Habilite sus optimizaciones de tiempo de todo el programa / enlace (para que sepa que las funciones no utilizadas en sus módulos no son requeridas por otros externos y se descartan)
  4. Toma los símbolos de tu binario y compáralos con los símbolos de 1.

Otro enfoque podría ser alguna herramienta de generación de gráficos de llamadas (por ejemplo, doxygen).

 3
Author: flolo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-26 16:43:12

Te sugiero que uses un par de enfoques: 1. GCC tiene algunas banderas de compilación útiles:

-Wunused-function
-Wunused-label
-Wunused-value
-Wunused-variable
-Wunused-parameter
-Wunused-but-set-parameter

2. Cppcheck tiene algunas características útiles como:

 --enable=unusedFunction

3. Utilice el analizador estático como se sugirió antes.

 1
Author: unresolved_external,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-28 12:22:53

Un enfoque que funciona para mí - con Delphi - es habilitar la depuración, y ejecutar su programa bajo el depurador.

Cuando se ejecuta un programa Delphi bajo el depurador, el IDE muestra en el margen qué líneas de código se pueden establecer como puntos de interrupción. El código que está realmente muerto, es decir, que ha sido eliminado por el enlazador/compilador, es obvio, ya que los puntos de interrupción no se pueden establecer allí.

Algunas notas adicionales, ya que los comentaristas parecen malinterpretar esto:

A: No es necesario probar la configuración un punto de interrupción en cada línea. Simplemente abra el archivo de origen en el IDE y desplácese rápidamente a través de él. El código muerto es fácil de detectar.

B: Esta NO es una verificación de 'cobertura de código'. No es necesario ejecutar la aplicación para ver si llega a las líneas.

C: No estoy lo suficientemente familiarizado con VS2008, así que no puedo decir si esta sugerencia funcionará.

 0
Author: Roddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-18 09:17:39

O bien
1) La herramienta de análisis estático construida de MSVC es infrautilizada .
2) El MSVC marketplace tiene un montón de herramientas incluyendo soporte para la mayoría de las herramientas gratuitas, incluyendo CppCheck

Necesitará la última versión de Visual Studio para aplicaciones de mercado, pero la versión gratuita " Community Edition" tiene licencias muy indulgentes.

 0
Author: Tiger4Hire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-22 12:38:58

Escriba un script que borre aleatoriamente una función (del código fuente) y recompile todo desde cero. Si todavía compila - esa función era código muerto.

 -2
Author: Krzysztof Kowalczyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-18 21:12:01