Pergunta

Eu tenho um grande legado C ++ projeto compilado em Visual Studio 2008. Eu sei que há uma razoável quantidade de código 'morto' que não é acessado em qualquer lugar -. Métodos que não são chamados, classes inteiras que não são usados ??

Eu estou procurando uma ferramenta que irá identificar este por análise estática .

Esta questão: detecção de códigos Dead in legado C / C ++ projeto sugere o uso de ferramentas de cobertura de código. Esta não é uma opção como a cobertura de teste simplesmente não é alta o suficiente.

Ele também menciona uma -Wunreachable-código. opção de gcc. Eu gostaria de algo semelhante para Visual Studio. Já o uso do vinculador / OPT:. Opção REF para remover código redundante, mas isso não relatar o código morto em um nível útil (quando usado com / VERBOSE existem mais de 100.000 linhas, incluindo um monte de bibliotecas)

Existem opções melhores que funcionam bem com um projeto Visual Studio?

Foi útil?

Solução

Você vai querer algo ao longo das linhas de QA-C ++ ( http: //www.programmingresearch. com / QACPP_MAIN.html ), veja também http://en.wikipedia.org/wiki / List_of_tools_for_static_code_analysis para produtos similares.

Você está procurando uma ferramenta de análise estática de código que detecta código inacessível; muitas diretrizes de codificação (como MISRA-C ++, se não me engano) exigem que não existe nenhum código inacessível. Uma ferramenta de análise voltado especificamente a executar essa diretriz seria sua melhor aposta.

E você vai gostar ser capaz de encontrar outros usos para a ferramenta também.

Outras dicas

Eu sei que os produtos Lint de Gimpel ( PC-Lint e Flexelint ) irá identificar código inacessível e módulos não utilizados / não referenciadas.

Os dois caem na categoria de ferramentas de análise estática.

Eu não tenho nenhuma afiliação w / Gimpel, apenas um cliente a longo prazo satisfeito.

Eu não sei Visual C, e também tinha recomendado as ferramentas de cobertura específica de código -Wunreachable. Como solução para a sua situação eu iria tentar o seguinte:

  1. Faça com ctags (ou Programa semelhante) Uma lista de todos os seus símbolos em sua fonte
  2. Ativar em seu compilador a eliminação de código morto (eu diria que o padrão é on)
  3. Permita que seus todo o programa / link otimizações de tempo (assim ele sabe que as funções não utilizados em suas moduls não são necessários por outros fatores externos e se descartado)
  4. Tome os símbolos do seu binário e compará-los com os símbolos a partir de 1.

Outra abordagem poderia ser algum ferramenta gerador gráfico de chamadas (por exemplo doxygen).

Eu sugiro que você use um casal se aproxima: 1. GCC tem alguns sinalizadores de compilação útil:

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

2. Cppcheck tem algumas características úteis como:

 --enable=unusedFunction

3. Use analisador estático como era sugerem antes.

Uma abordagem que funciona para mim - com Delphi -. É permitir a depuração, e executar o seu programa sob o depurador

Quando um programa Delphi é executado sob o depurador, as mostras do IDE na margem que linhas de código pode ser definido como pontos de paragem. Código que está realmente morto -. Ou seja, tem sido despojado pelo vinculador / compilador é óbvia como pontos de interrupção não pode ser definido lá

Algumas notas adicionais, como comentadores parecem não entender isso:

R: Você não precisa tentar definir um ponto de interrupção em cada linha. Basta abrir o arquivo de origem no IDE, e rolar rapidamente através dele. Código morto é facilmente visto.

b: Esta não é uma 'cobertura de código' cheque. Você não precisa para executar o aplicativo para ver se ele atinge as linhas.

c: Eu não sou VS2008 bastante familiarizado isso não posso dizer se esta sugestão vai funcionar.

De qualquer
1) do MSVC sob utilizado em construído ferramenta análise estático.
2) O MSVC mercado tem muitas ferramentas, incluindo suporte para a maioria das ferramentas gratuitas, incluindo CppCheck

Você vai precisar da versão mais recente do Visual Studio para aplicações de mercado, mas o livre " Community Edition " tem de licenciamento muito branda.

Escrever um script que exclui aleatoriamente uma função (a partir do código-fonte) e recompila tudo do zero. Se ainda compila -. Essa função foi código morto

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top