Qual é a diferença entre análise de código estático e revisão de código?

9

Eu só queria saber qual é a diferença entre análise de código estática e revisão de código. Como são feitos cada um desses dois? Mais especificamente, quais são as ferramentas disponíveis hoje para revisão de código / análise estática do PHP? Também gostaria de saber sobre boas ferramentas para revisão de código em qualquer idioma.

Thomas Owens
fonte
Uma revisão de código geralmente é um processo manual pelo qual outro programador examina seu código. É uma maneira de detectar pequenos erros ou desvios das convenções de codificação, etc., e uma boa maneira de melhorar a qualidade geral do código. A análise de código estático é algo para o qual você pode usar uma ferramenta, embora eu nunca tenha feito isso sozinho. Interessado em ver quais respostas os outros têm
9
Em duas palavras? "Um cérebro".
MSalters

Respostas:

19

Revisão de código é algo que as pessoas fazem, análise estática é algo que as máquinas fazem. Existem (às vezes boas) ferramentas de análise estática. A revisão de código é quando um colega / mentor / professor / amigo repassa seu código e faz críticas construtivas.

A análise estática é, por outro lado, um processo automatizado no qual uma máquina, informada pelo que sabe sobre a linguagem que está analisando (geralmente do sistema de tipos), analisa um programa e tenta descobrir coisas que podem estar incorretas, estilo ineficiente, ruim ou subótimo.

Rafe Kettler
fonte
2
Sempre tive a impressão de que a revisão de código é uma espécie de análise estática, pois é uma maneira de medir a saúde do software sem executá-lo.
Buhb
4
@ Buhb: acrescenta crucialmente o conhecimento do contexto. Um revisor de código deve entender se o código está fazendo o que é esperado. Uma ferramenta estática irá (na melhor das hipóteses, se a linguagem permitir isso através de alguma decoração / asserção / contrato) verificará que tudo está formalmente ok ... Então você pode colocar de outra maneira: a análise estática é uma espécie de revisão de código, realizada algoritmicamente.
27412 Francesco
Só para acrescentar, Lint (analista estático): Cara, isso não é necessário! Colega (Revisor): Você também pode fazer o mesmo !!
Kushal
11

A análise estática é o processo de analisar um software sem executá-lo. Isso é muito bom e recomendado, mas você deve ter em mente que

  1. diferentes ferramentas de análise estática têm uma compreensão diferente do código que estão estudando, portanto, podem sinalizar (ou não sinalizar) problemas diferentes. Uma ferramenta pode fornecer um relatório limpo e a outra pode reclamar de um milhão de coisas.
  2. uma ferramenta dinâmica (para citar um exemplo, pense em valgrind) pode encontrar muitos outros problemas, ao preço de uma carga séria no consumo de recursos (tempo, uso de memória). Isso ocorre porque geralmente você está executando uma versão instrumentada do software. Observe que, ao ser instrumentado de alguma forma (substitua seu malloc por um malloc de depuração), ele não é exatamente idêntico ao seu software (como você pode ver nos tempos de execução)

Ambas as abordagens sofrem com a falta de contexto: elas não sabem o que o sw deve alcançar.

A revisão do código é feita por outro codificador, que supostamente o conhece e pode verificar

  1. se o código estiver correto
  2. se o software estiver semanticamente correto.

É muito mais caro e tem um grau variável de repetibilidade, mas é uma grande ajuda.

Como sempre, não há uma única bala de prata que conserte todos os erros e evite todos os problemas. Aplicação - o máximo possível, considerando o local, o código, a hora e as três formas de verificação (estática, dinâmica, mais olhos (e cérebros) realmente olhando para o código).

ps: Devo observar que geralmente é muito melhor aplicar as ferramentas do zero. Converter um sistema legado é uma experiência muito menos agradável, devido a falsos positivos. Se você começar do zero e sempre tentar manter a ferramenta de análise limpa, provavelmente evitará muitos problemas.

pps: quanto às ferramentas, isso depende do idioma. No mundo C e C ++, você pode começar observando o próprio Visual Studio, que contém uma ferramenta de análise estática interna. Uma lista relativamente completa pode ser encontrada na Wikipedia.

ppps: a análise estática é mais adequada para linguagens estáticas, como C ou C ++. Para Python, pode ser realmente difícil dizer se um nome que se refere a uma lista em um momento se refere a uma lista para o restante do programa, devido às suas propriedades dinâmicas. Isso não significa que nada possa ser feito, como mostra um esforço de JIT, como mostra o PyPy .

Francesco
fonte
2

Revisão de código é quando uma autoridade sênior ou dedicada verifica seu código, sua maneira de codificar, os padrões seguidos no código e, especificamente, o nível lógico do código

No que diz respeito à análise estática, é a análise do software de computador que é executada sem realmente executar os programas criados a partir desse software (a análise executada nos programas em execução é conhecida como análise dinâmica)

A lista de ferramentas de acordo com a tecnologia é fornecida no link abaixo

Lista de ferramentas para análise estática

Portanto, revisão de código e análise estática são termos completamente diferentes.

OM a eternidade
fonte
7
A resposta da OM está essencialmente correta, exceto que eu brinco com 'Uma autoridade sênior ou uma autoridade dedicada verifica seu código ...'. É verdade que algumas lojas disfuncionais conduzem revisões de código dessa maneira pai / filho, muitas (e melhores) possuem um sistema de revisão de código ponto a ponto que não se assemelha a um professor que classifica um problema de lição de casa. Onde trabalho, é comum que um júnior analise o trabalho de um sénior. O objetivo é ter um segundo par de olhos olhar para todo o código antes de ser verificado.
Jim No Texas
2
@JimInTexas, o mesmo em nossa loja. Eu diria que o resultado mais importante (a longo prazo) das revisões de código é a disseminação de conhecimento, práticas unificadoras e visão de arquitetura / design em toda a equipe. A esse respeito, um júnior que revisa o código de um sénior é, na pior das hipóteses, uma ótima maneira de aprender as melhores práticas locais - mas quem diz que um sénior nunca comete erros e que um júnior nunca pode identificá-los?
Péter Török 26/03
1

A revisão de código é uma avaliação mais qualitativa, a análise estática de código é uma avaliação mais quantitativa.

Ei, garoto, esse método pode ser escrito melhor

vs, fe

Desempenho diminuído. É ineficiente identificar uma sequência vazia usando a construção 'wcslen (str)> 0'. Uma maneira mais eficiente é verificar: str [0]! = '\ 0'.

Desempenho diminuído. A expressão do tipo strlen (MyStr.c_str ()) pode ser reescrita como MyStr.length ()

Desempenho diminuído. Caso 'Order' seja iterador, é mais eficaz usar a forma de prefixo de incremento. Substitua iterator ++ por ++ iterator.

Embora erros reais possam (obviamente) existir e ser detectados pelo SCA

Formato incorreto. Considere verificar o argumento real da função 'Foo'

A expressão foi colocada entre parênteses duas vezes: ((expressão)). Um par de parênteses é desnecessário ou a impressão incorreta está presente

Uma chamada da função 'memset' levará ao estouro do buffer 'dest.lfFaceName'

Lazy Badger
fonte
desculpe insultar você. Quanto ao que meu comentário (desaparecido?) Pretendia dizer - você sabe de alguma razão pela qual um ser humano não pode oferecer os mesmos comentários que você fornece como exemplos de saída da análise de código estático?
sq33G
@ sq33G: Não. Qualquer pessoa com material de escritório (quantidade praticamente infinita de papel) pode simular uma máquina de Turing arbitrária. No entanto, é chato e demorado. (Possivelmente não o dado, mas diga comportamentos indefinidos em C).
Maciej Piechotka 19/03/2013
Ah Portanto, a verdadeira resposta à pergunta do OP é que as máquinas de Turing não são completas para o ser humano.
sq33G
0

Análise estática é quando um artefato é analisado sem ser executado. Embora possa ser aplicado a qualquer artefato, geralmente é aplicado ao código-fonte ou código de objeto e refere-se ao uso de ferramentas específicas para analisar e obter informações sobre esses produtos de trabalho. Essas ferramentas produzem relatórios que são interpretados por um engenheiro para uso na determinação da qualidade do sistema em construção e como um guia para o planejamento do desenvolvimento e manutenção. A Wikipedia possui uma lista de ferramentas para análise estática , organizadas por idioma e com uma breve descrição de seus recursos.

Revisões são uma avaliação humana de algum produto de trabalho, que pode ser código. As revisões também podem ser realizadas em projetos ou outros documentos. A idéia é que pessoas familiarizadas com o produto de trabalho que não seja o desenvolvedor estejam olhando para encontrar erros, desde problemas de segurança até violações do padrão de codificação.

Tecnicamente, uma revisão de código pode ser considerada uma forma de análise estática, pois o código não é realmente executado durante a revisão. No entanto, na terminologia comum, "análise estática" geralmente se refere à análise por máquina de arquivos de origem ou de objeto, enquanto "revisão" indica que é o homem que faz a análise.

Thomas Owens
fonte
-2

A revisão de código é uma técnica útil para detectar problemas no código fonte muito cedo. Como parte deste exercício, muitos problemas como desempenho, escalabilidade e padrões de codificação foram identificados e corrigidos. Isso melhorará a qualidade do código.

A análise estática é usada para analisar as métricas de qualidade de código, como complexidade ciclométrica, índice de manutenção, profundidade de herança e acoplamentos de classe. Várias ferramentas disponíveis no mercado para analisar as qualidades do código. O desenvolvedor de C # usa o Microsoft visual studio para gerar relatórios de métricas.

Balasubramanian.S
fonte
-3

análise de código estático é realizada por ferramenta automatizada, revisão de código é feita com as pessoas antes que o código seja confirmado.

Ferramentas para revisão de código:

1. além de comparar

2.o diff do software de controle de versão

Essas ferramentas são sempre usadas para gerar a diferença entre a versão antiga e a nova versão.

upton
fonte
2
1) Não é necessário que o código seja confirmado - a revisão do código é feita por pessoas e 2) Acho a descrição das ferramentas diff como ferramentas de revisão de código "interessantes" certamente são ferramentas usadas para identificar o código para revisão, mas se Me perguntaram sobre ferramentas de revisão de código que provavelmente apontaria para aquelas que ajudam a gerenciar o processo (usei o Kiln e o Crucible, por exemplo).
Murph