Pergunta

Como você iria sobre a detecção de código morto em código C / C ++? Eu tenho uma grande base de código para trabalhar com e pelo menos 10-15% é código morto. Existe alguma ferramenta baseada Unix para identificar estas áreas? Algumas partes do código ainda usam um monte de pré-processador, pode automatizado identificador de processo que?

Foi útil?

Solução

Você pode usar uma ferramenta de análise de cobertura de código para isso e olhar para os pontos não utilizados em seu código.

A ferramenta popular para o conjunto de ferramentas gcc é gcov, juntamente com o lcov interface gráfica ( http: / /ltp.sourceforge.net/coverage/lcov.php ).

Se você usar o gcc, você pode compilar com suporte gcov, que é ativado pela bandeira '--coverage'. Em seguida, executar o aplicativo ou executar o seu conjunto de testes com este gcov habilitado compilação.

Basicamente gcc irá emitir alguns arquivos extras durante a compilação e a aplicação também irá emitir alguns dados de cobertura durante a execução. Você tem que recolher todos estes (.gcdo e .gcda arquivos). Eu não vou em detalhes aqui, mas você provavelmente precisa definir duas variáveis ??de ambiente para recolher os dados de cobertura de uma forma sã: GCOV_PREFIX e GCOV_PREFIX_STRIP ...

Após a corrida, você pode colocar todos os dados de cobertura em conjunto e executá-lo através do ToolSuite lcov. Mesclando de todos os arquivos de cobertura de diferentes execuções de teste também é possível, embora um pouco envolvida.

De qualquer forma, você acaba com um bom conjunto de páginas mostrando algumas informações de cobertura, apontando os pedaços de código que não têm cobertura e, portanto, não foram utilizados.

Claro, você precisa verifique se as partes do código não são usadas em qualquer situação e muito depende de quão bom seus testes de exercer a base de código. Mas, pelo menos, isso vai lhe dar uma idéia sobre possíveis candidatos de código morto ...

Outras dicas

compilá-lo sob gcc com -Wunreachable-código.

Eu acho que o mais recente versão, os melhores resultados você vai obter, mas posso estar errado na minha impressão de que é algo que temos trabalhado ativamente em. Note que isto faz análise de fluxo, mas eu não acredito que ele fala sobre "código" que já está morto no momento em que deixa o pré-processador, porque isso nunca analisado pelo compilador. Também não detectará por exemplo funções exportadas que nunca são chamados, ou caso especial código de manipulação que só assim acontecer de ser impossível, porque nada nunca chama a função com esse parâmetro -. você precisa de cobertura de código para que (e executar os testes funcionais, e não os testes de unidade Testes de unidade são deveria ter% de cobertura de código 100, e, portanto, executar caminhos de código que são 'morto' na medida em que a aplicação está em causa). Ainda assim, com estas limitações em mente que é uma maneira fácil de começar a encontrar as rotinas mais completamente bollixed na base de código.

Este comunicado CERT lista algumas outras ferramentas para código morto estática detecção

Sua abordagem depende da disponibilidade testes (automatizado). Se você tem um conjunto de testes que você confia para cobrir uma quantidade suficiente de funcionalidade, você pode usar uma análise de cobertura, como respostas anteriores já sugeriram.

Se você não tem tanta sorte, você pode querer olhar para as ferramentas de análise de código fonte como SciTools ' Entenda que pode ajudá-lo a analisar o seu código usando um monte de construída em relatórios de análise. Minha experiência com que as datas de ferramentas a partir de 2 anos atrás, então eu não posso lhe dar muitos detalhes, mas o que eu me lembro é que eles tinham um apoio impressionante, com tempos de resposta muito rápida de correções de bugs e respostas às perguntas.

Eu encontrei uma página sobre código fonte estática análise que lista muitas outras ferramentas também.

Se isso não ajudá-lo suficientemente, quer, e você está interessado especificamente em descobrir o código mortos relacionados com a pré-processador, eu recomendo que você postar mais alguns detalhes sobre o código. Por exemplo, se ele está principalmente relacionado com várias combinações de configurações #ifdef você pode escrever scripts para determinar os (combinações de) configurações e descobrir quais combinações nunca são realmente construído, etc.

g ++ 4.01 -Wunreachable-code adverte sobre o código que está inacessível dentro de uma função, mas não avisa sobre as funções não utilizadas.

int foo() { 
    return 21; // point a
}

int bar() {
  int a = 7;
  return a;
  a += 9;  // point b
  return a;
}

int main(int, char **) {
    return bar();
}

g ++ 4.01 emitirá um aviso sobre o ponto b, mas não dizem nada sobre foo () (ponto a) mesmo que ele está inacessível neste arquivo. Este comportamento está correto embora decepcionante, porque um compilador não pode saber que a função foo () não é declarado extern em alguma outra unidade de compilação e invocado de lá; apenas uma vinculador pode ter certeza.

único código para C e assumindo que o código fonte de todo o projecto está disponível, inicie uma análise com a ferramenta Open Source Frama-C . Qualquer declaração do programa que exibe vermelha no GUI é código morto.

Se você tem problemas "Dead Code", você também pode estar interessado em remoção de "código de reposição", código que é executado, mas não faz contribuir para o resultado final. Isso requer que você forneça uma modelização precisa de funções de I / O (você não gostaria para remover um cálculo que parece ser "livre", mas que é usado como um argumento para printf). Frama-C tem uma opção para apontar código livre.

Mozilla e Open Office têm soluções home-grown.

análise de código morto como este requer uma análise global de todo o seu projeto. Você não pode obter esta informação através da análise de unidades de tradução individualmente (bem, você pode detectar entidades mortos se eles estão inteiramente dentro de uma única unidade de tradução, mas eu não acho que isso é o que você realmente está procurando).

Nós usamos o nosso DMS Software Reengineering Toolkit para implementar exatamente este para o código Java, analisando todos os compilação-unidades envolvidas ao mesmo tempo, a construção de tabelas de símbolos para tudo e perseguir todas as referências. A definição de nível superior, sem referências e sem pretensão de ser um item API externa está morta. Esta ferramenta também retira automaticamente o código morto, e no final você pode escolher o que você quer:. O relatório de entidades mortas, ou o código despojado dessas entidades

DMS também analisa C ++ em uma variedade de dialetos (EDIT fevereiro 2014: incluindo MS e versões do CCG de C ++ 14 [EDIT novembro 2017: agora C ++ 17] ) e constrói todas as tabelas de símbolos necessários. Rastrear as referências mortas seria simples a partir desse ponto. DMS, também poderia ser utilizada para descascar para fora. Consulte http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html

Bullseye cobertura ferramenta ajudaria. Não é, porém livre.

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