Às vezes, é útil no meu trabalho modificar o código-fonte de outra pessoa ou descobrir como desenvolver coisas específicas para o seu próprio aplicativo. No entanto, nem todos os softwares possuem boa documentação.
Qual é uma boa maneira de entender a estrutura geral de uma base de código?
Por exemplo, quais rotinas chama quais rotinas, etc. Eu poderia usar uma ferramenta de documentação como o Doxygen para esse fim, no entanto, estava pensando se há uma estratégia melhor?
software
documentation
Allan P. Engsig-Karup
fonte
fonte
Respostas:
Os seguintes segmentos estão relacionados tangencialmente:
Na primeira parte da minha tese, passei 18 meses modificando o código não documentado do Fortran, e uma das primeiras tarefas foi tentar entender a estrutura geral de uma base de código. A coisa mais importante que sugiro que você faça é tomar notas em um arquivo de texto sempre que descobrir algo. Você não precisa reaprender ou redescobrir coisas durante esse processo demorado e frustrante.
No meu caso, não havia "API" para falar, pois os argumentos das funções não eram auto-documentados, porque o programador anterior usava o estilo Fortran 77 e, portanto, identificadores curtos com pouca ou nenhuma sugestão do que Eles significavam. Não houve testes e, como é o Fortran, não há cabeçalhos. Adicionando ainda mais diversão à mistura, havia algumas funções aqui e ali escritas em C ou C ++.
Coisas que funcionaram para mim (supondo que você trabalhe no Linux):
grep
. Aprenda a amargrep
; você o usará no shell para descobrir onde as funções são declaradas e chamadas, e a saída informará em quais arquivos procurar.nm
. Pode ser útil em bibliotecas se você não tiver o código-fonte para elas, mas deseja saber se uma função que você encontrou está nessa biblioteca. No entanto, só funciona se os símbolos da biblioteca não tiverem sido removidos.print
declarações.ddd
egdb
são ótimos, e em praticamente todos os sistemas Linux existentes. Sinta-se livre para usar seu depurador favorito.Coisas que eu gostaria de ter pensado antes, ou simplesmente não eram opções para mim:
gcov
elcov
faça uma análise de cobertura em execuções típicas do código, se você tiver exemplos ou executáveis para trabalhar. Se houver exemplos que devem executar grandes partes da base de código, essas duas ferramentas combinadas informarão quantas vezes cada linha de código é visitada. É mais útil com os sinalizadores de depuração ativados. Se uma parte do código não é visitada, provavelmente é menos importante entendê-lo imediatamente. Se uma parte do código é visitada muito, provavelmente vale a pena entender o que é. Talvez o código seja executado muito porque é um loop sem importância, ou pode ser uma função importante na qual muitas outras funções dependem. Você não pode dizer apenas sobre a análise de cobertura, mas a análise de cobertura fornece uma idéia de onde você deve concentrar seu tempo.splint
podem dizer se algo suspeito está acontecendo no código, como algumas variáveis nunca são usadas.dot
egraphviz
para gerar gráficos de chamada e ver quantas vezes as funções são chamadas, como a análise de cobertura. Para códigos complexos, uma análise gráfica pode ser muito mais útil.fonte
Eu sempre digo aos meus alunos para lerem um código de baixo para cima: você começa em main () e vê o que ele chama. Normalmente, este é apenas um pequeno número de funções. Em seguida, você analisa as funções chamadas de main () que normalmente definem o fluxo geral do algoritmo (loop de tempo, montagem, solucionador, saída, etc). Suba mais ou menos dois níveis para obter uma visão geral do algoritmo a 30.000 pés. O restante pode ser encontrado na documentação do doxygen etc.
Mas como eu disse, a mensagem é: Leia o código de baixo para cima.
fonte