Como localizo funções não chamadas? [fechadas]

8

Eu estou olhando para algum código C / C ++ que parece ter funções definidas, mas nunca usadas. Este é um processo bastante tedioso para rastrear o código e verificar. Eu fiz algumas pesquisas e existem várias ferramentas que podem fazer esse tipo de análise.

Alguém pode compartilhar experiências ou dicas sobre quais ferramentas e técnicas são melhores ou métodos alternativos para verificar esse código de fato não são usados?

user59871
fonte

Respostas:

10

Existem algumas ferramentas por aí que podem encontrar 'código morto' em seus programas. você pode ler sobre eles nos threads Stack Overflow aqui e aqui . um pequeno resumo:

use os sinalizadores do compilador gcc -Wunused e -Wunreachable-code e use uma ferramenta como lcov para encontrar os métodos não utilizados.

Jakob Weisblat
fonte
3
Não tenha certeza de quais recursos para isso existem no seu compilador, mas esteja ciente de que, se você estiver usando a chamada com base em qualquer tipo de reflexão ou RTTI, é possível chamar um método por nome que não seja referenciado estaticamente em nenhum lugar da base de código.
Mason Wheeler
5

Vestígio? Por quê? Apenas comente-os e execute o compilador. Ele informará rapidamente se você comentou alguma função referenciada em outro lugar.

DeadMG
fonte
3
É importante notar que isso só funcionará em linguagens compiladas, e não interpretadas como PHP. Além disso, é impraticável para qualquer projeto grande, pois pode levar dias para realmente comentar / descomentar todos os métodos e verificá-los.
Davor Ždralo 23/07/12
1
Ele especifica claramente que ele está em C ++. A reconstrução incremental é extremamente rápida - se tudo o que você fez foi comentar um método em um arquivo de origem, o vinculador pode dizer com muita facilidade.
23712 DeadMG
Em C, isso deve funcionar principalmente. Mas há complicações como código que usa DEFINEs para alternar entre diferentes implementações. No C ++, isso não funcionará de forma confiável devido à sobrecarga de funções, especialização de modelos e provavelmente alguns outros recursos.
CodesInChaos
2

Se você estiver procurando ativamente por código não utilizado, use algo sugerido por Jake223 .

Mas, se você apenas encontrar algum código que parece não ser usado, basta pesquisar o nome do método na sua base de código. Se for um método privado, seu trabalho é fácil, pesquise apenas a classe atual. Se for um método público, pesquise tudo. Se for uma classe inteira, procure o nome em todo o seu código.

Sem sucesso? Perfeito. Exclua o código e execute testes . Você tem testes, não é? Em seguida, confirme suas alterações no sistema de versão do documento . Você usa um, não é? Dessa forma, se você descobrir, sempre, que precisa disso de volta, basta reverter uma mudança.

A exclusão do código deve ser algo que você faz todos os dias. Talvez você refatorar algum código e excluir o antigo. Ou encontre um código antigo e não utilizado e exclua-o. E mesmo que você não tenha backups, quão difícil é reescrever uma função ou duas? E na segunda vez, você certamente os escreverá melhor do que antes.

Patkos Csaba
fonte
+1 por sugerir o bom, antiquado e tedioso processo de procurar manualmente os nomes das funções. Não é muito divertido, mas funciona!
1
E também não é tão tedioso. Qualquer IDE moderno pode pesquisar de maneira muito inteligente qualquer texto. Além disso, para C, C ++, Java e até algum grau para PHP, você pode simplesmente clicar com o botão direito do mouse em uma função e clicar em "Encontrar uso".
Patkos Csaba
0

A menos que você esteja procurando problemas (ou seja, você sabe que eles devem ser chamados) por que se preocupar. Se eles forem genuinamente desnecessários, provavelmente serão removidos pelo vinculador e, em qualquer caso, o espaço desperdiçado não será significativo. Por outro lado, se você removê-los e depois descobrir que eles eram necessários (talvez em alguma configuração do compilador desconhecida), você terá mais trabalho a fazer para recuperá-los. Isso é especialmente difícil se a remoção e a redescoberta forem separadas por muito tempo.

ddyer
fonte
4
O motivo é que, se não forem necessárias, você estará mantendo um código que não deveria ser mantido e, portanto, desperdiçando um tempo valioso de engenharia.
22712 Michael Kohne
Quando você estiver trabalhando em algo, sim, haverá muitas funções desnecessárias, portanto, você precisará mantê-las por perto, mesmo que seu compilador avise que elas não devem estar por perto. Uma boa idéia seria comentá-los se houver menos probabilidade de serem usados. Mas adicione um marcador claro que diga que esse código não é lixo eletrônico, adicione uma data e, se você faz parte de uma equipe, com quem entrar em contato antes de limpá-los.
DPD 23/07
De acordo com o DO-178, funções não utilizadas que não são justificadas pelo projeto não devem estar presentes.
jinawee
0

Meu IDE de escolha é o Eclipse, e embora seja complicado e complicado de configurar no início, vale a pena o esforço considerando todas as ferramentas que recebo. Uma dessas ferramentas (e eu não tenho idéia de qual é o nome oficial) informa sobre códigos não utilizados, como classes, funções, variáveis ​​etc. O IDE simplesmente exibe uma linha amarela abaixo da declaração. Não tenho 100% de certeza se isso funciona com projetos com vários arquivos, mas você sempre pode tentar!

Zach Dziura
fonte
0

Os IDEs geralmente possuem esse recurso bem implementado e funcionam por padrão (geralmente podem ser desativados).

Qualquer que seja o método escolhido nas outras respostas para encontrar código morto, esteja sempre ciente dos problemas de reflexão. Alguns métodos / campos podem ser acessados ​​apenas através da reflexão. A remoção desses métodos não acionará nenhum alarme, exceto no tempo de execução.

Se você tiver (bons) testes escritos para seus projetos, eles serão de grande valor nessa situação.

Radu Murzea
fonte
0

Você pode usar o Cppcheck para esta finalidade:

$ cppcheck --enable=unusedFunction .
Checking foo.c...
1/2 files checked 0% done
Checking main.c...
2/2 files checked 0% done
[foo.c:1]: (style) The function 'foo' is never used.

fonte