Análise estática do programa - Static program analysis

A análise estática do programa é a análise do software de computador que é realizada sem realmente executar os programas, em contraste com a análise dinâmica , que é a análise realizada nos programas durante a execução. Na maioria dos casos, a análise é realizada em alguma versão do código-fonte e, nos outros casos, em alguma forma do código-objeto .

O termo é geralmente aplicado à análise realizada por uma ferramenta automatizada , com a análise humana sendo chamada de compreensão do programa , compreensão do programa ou revisão de código . As inspeções de software e as revisões de software também são usadas neste último caso.

Justificativa

A sofisticação da análise realizada por ferramentas varia desde aquelas que consideram apenas o comportamento de instruções e declarações individuais, até aquelas que incluem o código-fonte completo de um programa em sua análise. Os usos das informações obtidas na análise variam desde o destaque de possíveis erros de codificação (por exemplo, a ferramenta lint ) até métodos formais que provam matematicamente as propriedades sobre um determinado programa (por exemplo, seu comportamento corresponde ao de sua especificação).

Métricas de software e engenharia reversa podem ser descritas como formas de análise estática. As métricas de software derivadas e a análise estática são cada vez mais implementadas juntas, especialmente na criação de sistemas embarcados, definindo os chamados objetivos de qualidade de software .

Um uso comercial crescente da análise estática é na verificação das propriedades do software usado em sistemas de computador críticos para a segurança e na localização de códigos potencialmente vulneráveis . Por exemplo, as seguintes indústrias identificaram o uso de análise de código estático como um meio de melhorar a qualidade de software cada vez mais sofisticado e complexo:

  1. Software médico : a Food and Drug Administration (FDA) dos EUA identificou o uso de análise estática para dispositivos médicos.
  2. Software nuclear: No Reino Unido, o Office for Nuclear Regulation (ONR) recomenda o uso de análise estática nos sistemas de proteção do reator .
  3. Software de aviação (em combinação com análise dinâmica )
  4. Automotivo e Máquinas (os recursos de segurança funcional são parte integrante de cada fase de desenvolvimento de produto automotivo, ISO 26262 , Seção 8.)

Um estudo realizado em 2012 pela VDC Research relatou que 28,7% dos engenheiros de software embarcados pesquisados ​​atualmente usam ferramentas de análise estática e 39,7% esperam usá-las em 2 anos. Um estudo de 2010 descobriu que 60% dos desenvolvedores entrevistados em projetos de pesquisa europeus fizeram pelo menos uso de seus analisadores estáticos embutidos de IDE básicos. No entanto, apenas cerca de 10% empregaram uma outra ferramenta de análise adicional (e talvez mais avançada).

Na indústria de segurança de aplicativos, o nome teste de segurança de aplicativos estáticos (SAST) também é usado. O SAST é uma parte importante dos Security Development Lifecycles (SDLs), como o SDL definido pela Microsoft e uma prática comum em empresas de software.

Tipos de ferramentas

O OMG ( Object Management Group ) publicou um estudo sobre os tipos de análise de software necessários para medição e avaliação de qualidade de software . Este documento sobre "Como entregar sistemas de TI resilientes, seguros, eficientes e facilmente modificados de acordo com as recomendações do CISQ" descreve três níveis de análise de software.

Nível da Unidade
Análise que ocorre dentro de um programa ou sub-rotina específico, sem conexão com o contexto desse programa.
Nível de Tecnologia
Análise que leva em consideração as interações entre os programas de unidade para obter uma visão mais holística e semântica do programa geral, a fim de encontrar problemas e evitar falsos positivos óbvios. Por exemplo, é possível analisar estaticamente a pilha de tecnologia Android para encontrar erros de permissão.
Nível do sistema
Análise que leva em consideração as interações entre os programas da unidade, mas sem se limitar a uma tecnologia ou linguagem de programação específica.

Um outro nível de análise de software pode ser definido.

Missão / Nível de Negócios
Análise que leva em consideração os termos da camada de negócios / missão, regras e processos que são implementados no sistema de software para sua operação como parte da empresa ou atividades da camada de programa / missão. Esses elementos são implementados sem serem limitados a uma tecnologia ou linguagem de programação específica e, em muitos casos, são distribuídos em várias linguagens, mas são extraídos estaticamente e analisados ​​para compreensão do sistema para garantia da missão.

Métodos formais

Métodos formais é o termo aplicado à análise de software (e hardware de computador ) cujos resultados são obtidos puramente por meio do uso de métodos matemáticos rigorosos. As técnicas matemáticas usadas incluem semântica denotacional , semântica axiomática , semântica operacional e interpretação abstrata .

Por uma redução direta ao problema de parada , é possível provar que (para qualquer linguagem completa de Turing ), encontrando todos os erros de tempo de execução possíveis em um programa arbitrário (ou mais geralmente qualquer tipo de violação de uma especificação no resultado final de um programa) é indecidível : não há método mecânico que possa sempre responder com verdade se um programa arbitrário pode ou não exibir erros de tempo de execução. Este resultado data dos trabalhos de Church , Gödel e Turing na década de 1930 (ver: Problema de parada e teorema de Rice ). Como acontece com muitas questões indecidíveis, ainda se pode tentar fornecer soluções aproximadas úteis.

Algumas das técnicas de implementação de análise estática formal incluem:

Análise estática baseada em dados

A análise estática baseada em dados usa grandes quantidades de código para inferir regras de codificação. Por exemplo, pode-se usar todos os pacotes de código aberto Java no GitHub para aprender uma boa estratégia de análise. A inferência de regra pode usar técnicas de aprendizado de máquina. Por exemplo, foi mostrado que quando alguém se desvia muito da maneira como se usa uma API orientada a objetos, é provável que seja um bug. Também é possível aprender com uma grande quantidade de correções e avisos anteriores.

Veja também

Referências

Leitura adicional

links externos