Análise estática do programa - Static program analysis
Desenvolvimento de software |
---|
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:
- Software médico : a Food and Drug Administration (FDA) dos EUA identificou o uso de análise estática para dispositivos médicos.
- 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 .
- Software de aviação (em combinação com análise dinâmica )
- 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:
- Interpretação abstrata , para modelar o efeito que cada instrução tem sobre o estado de uma máquina abstrata (ou seja, "executa" o software com base nas propriedades matemáticas de cada instrução e declaração). Essa máquina abstrata superaproxima os comportamentos do sistema: o sistema abstrato é assim simplificado de analisar, às custas da incompletude (nem todas as propriedades verdadeiras do sistema original são verdadeiras no sistema abstrato). Se feito corretamente, no entanto, a interpretação abstrata é som (cada propriedade verdadeira do sistema abstrato pode ser mapeado para uma verdadeira propriedade do sistema original).
- Análise de fluxo de dados , uma técnica baseada em rede para coletar informações sobre o possível conjunto de valores;
- Lógica Hoare , um sistema formal com um conjunto de regras lógicas para raciocinar rigorosamente sobre a correção de programas de computador . Há suporte de ferramenta para algumas linguagens de programação (por exemplo, a linguagem de programação SPARK (um subconjunto de Ada ) e a linguagem de modelagem Java —JML — usando ESC / Java e ESC / Java2 , plugin Frama-C WP ( pré-condição mais fraca ) para o C linguagem estendida com ACSL ( ANSI / ISO C Specification Language )).
- A verificação de modelos , considera os sistemas que possuem estado finito ou podem ser reduzidos ao estado finito por abstração ;
- Execução simbólica , usada para derivar expressões matemáticas que representam o valor de variáveis mutadas em pontos específicos do código.
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
- Auditoria de código
- Gerador de documentação
- Semântica formal de linguagens de programação
- Verificação formal
- Lista de ferramentas para análise estática de código
- Análise de forma (software)
- Qualidade de software
- Garantia de qualidade de software
- ISO 26262
- ISO 9126 (agora série ISO 25000)
- Lint (software)
Referências
Leitura adicional
- Ayewah, Nathaniel; Hovemeyer, David; Morgenthaler, J. David; Penix, John; Pugh, William (2008). "Usando a análise estática para encontrar bugs". Software IEEE . 25 (5): 22–29. CiteSeerX 10.1.1.187.8985 . doi : 10.1109 / MS.2008.130 . S2CID 20646690 .
- Brian Chess, Jacob West (Fortify Software) (2007). Programação segura com análise estática . Addison-Wesley. ISBN 978-0-321-42477-8.
- Flemming Nielson; Hanne R. Nielson; Chris Hankin (10/12/2004). Principles of Program Analysis (1999 (corrigido em 2004) ed.). Springer. ISBN 978-3-540-65410-0.
- "Interpretação abstrata e análise estática", International Winter School on Semantics and Applications 2003, por David A. Schmidt
links externos
- Melhoria da qualidade do código - verificação de conformidade com os padrões de codificação (DDJ)
- Concorrência na Verificação de Software (SV-COMP)
- Episódio 59: Entrevista de análise de código estático ( podcast ) na Software Engineering Radio
- Implementando governança automatizada para padrões de codificação Explica por que e como integrar a análise de código estático ao processo de construção
- Integre a análise estática em um processo de desenvolvimento de software
- O Projeto SAMATE , um recurso para ferramentas de Análise Estática Automatizada
- Uma introdução prática à análise estática de código