Análise de programa estático

Na ciência da computação , a análise estática de programas (ou análise estática ) é a análise de programas de computador realizada sem executá-los, em contraste com a análise dinâmica de programas , que é realizada em programas durante sua execução. [1] [2]

O termo geralmente é aplicado à análise realizada por uma ferramenta automatizada, com a análise humana sendo normalmente chamada de "compreensão do programa", compreensão do programa ou revisão do código . No último deles, também são utilizados a inspeção de software e os walkthroughs de software . Na maioria dos casos, a análise é realizada em alguma versão do código-fonte de um programa e, em outros casos, em alguma forma de seu código-objeto .

Justificativa

A sofisticação da análise realizada por ferramentas varia desde aquelas que consideram apenas o comportamento de comandos e declarações individuais, [3] até aquelas que incluem o código-fonte completo de um programa em sua análise. Os usos das informações obtidas da análise variam desde destacar possíveis erros de codificação (por exemplo, a ferramenta lint ) até métodos formais que provam matematicamente 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 . [4]

Um uso comercial crescente da análise estática está 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 . [5] Por exemplo, as seguintes indústrias identificaram o uso da 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. [6]
  2. Software nuclear: No Reino Unido, o Office for Nuclear Regulation (ONR) recomenda o uso de análise estática em sistemas de proteção de reatores . [7]
  3. Software de aviação (em combinação com análise dinâmica ). [8]
  4. Automotivo e Máquinas (recursos de segurança funcional são parte integrante de cada fase de desenvolvimento de produto automotivo, ISO 26262 , seção 8).

Um estudo de 2012 da 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 dentro de 2 anos. [9] Um estudo de 2010 descobriu que 60% dos desenvolvedores entrevistados em projetos de pesquisa europeus fizeram pelo menos uso de seus analisadores estáticos integrados de IDE básicos. No entanto, apenas cerca de 10% empregaram uma ferramenta de análise adicional (e talvez mais avançada). [10]

No setor de segurança de aplicativos, o nome Static application security testing (SAST) também é usado. O SAST é uma parte importante dos ciclos de vida de desenvolvimento de segurança (SDLs), como o SDL definido pela Microsoft [11] e uma prática comum em empresas de software. [12]

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 fornecer sistemas de TI resilientes, seguros, eficientes e facilmente alterados de acordo com as recomendações da CISQ" descreve três níveis de análise de software. [13]

Nível da Unidade
Análise que ocorre dentro de um programa ou sub-rotina específica, 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 da 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.
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, regras e processos da camada de negócios/missão que são implementados dentro do sistema de software para sua operação como parte das atividades da camada empresarial ou 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ários idiomas, 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 utilizadas incluem semântica denotacional , semântica axiomática , semântica operacional e interpretação abstrata .

Por uma redução direta ao problema da parada , é possível provar que (para qualquer linguagem Turing completa ), encontrar todos os possíveis erros de tempo de execução 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 existe um método mecânico que sempre possa responder com verdade se um programa arbitrário pode ou não apresentar erros de execução. Este resultado data dos trabalhos de Church , Gödel e Turing na década de 1930 (ver: Halting problem and Rice's theorem ). Como acontece com muitas questões indecidíveis, pode-se ainda tentar fornecer soluções aproximadas úteis.

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

Análise estática orientada por dados

A análise estática orientada por dados usa grandes quantidades de código para inferir regras de codificação. [16] [ fonte melhor necessária ] Por exemplo, pode-se usar todos os pacotes Java de código aberto 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. [17] Também é possível aprender com uma grande quantidade de correções e avisos anteriores. [16] [ melhor fonte necessária ]

Remediação

Os analisadores estáticos produzem avisos. Para certos tipos de avisos, é possível projetar e implementar técnicas de correção automatizadas . Por exemplo, Logozzo e Ball propuseram correções automatizadas para C# cccheck . [18]

Veja também

Referências

  1. ^ Wichmann, BA; Canning, AA; Clutterbuck, DL; Winsbarrow, LA; Ward, Nova Jersey; Marsh, DWR (março de 1995). "Perspectiva Industrial em Análise Estática" (PDF) . Revista de Engenharia de Software . 10 (2): 69–75. doi : 10.1049/sej.1995.0010. Arquivado do original (PDF) em 27/09/2011.
  2. ^ Egele, Manuel; Scholte, Theodoor; Kirda, Engin; Kruegel, Christopher (2008-03-05). "Uma pesquisa sobre técnicas e ferramentas dinâmicas automatizadas de análise de malware". ACM Computing Surveys . 44 (2): 6:1–6:42. doi : 10.1145/2089125.2089126. ISSN  0360-0300. S2CID  1863333.
  3. ^ Khatiwada, Saket; Tushev, Miroslav; Mahmoud, Anas (2018-01-01). "Semântica suficiente: uma abordagem teórica da informação para localização de bugs de software baseada em IR". Tecnologia da Informação e Software . 93 : 45–57. doi : 10.1016/j.infsof.2017.08.012.
  4. ^ "Objetivos de qualidade de software para código-fonte" Arquivado em 04/06/2015 no Wayback Machine (PDF). Anais: Embedded Real Time Software and Systems 2010 Conference , ERTS2010.org, Toulouse, França: Patrick Briand, Martin Brochet, Thierry Cambois, Emmanuel Coutenceau, Olivier Guetta, Daniel Mainberte, Frederic Mondot, Patrick Munier, Loic Noury, Philippe Spozio, Frederic Retailleau.
  5. ^ Melhorando a segurança de software com análise estática e de tempo de execução precisa Arquivado em 05/06/2011 no Wayback Machine (PDF), Benjamin Livshits, seção 7.3 "Técnicas estáticas para segurança". Tese de doutorado de Stanford, 2006.
  6. ^ FDA (2010-09-08). "Pesquisa de segurança de software de bomba de infusão no FDA" . Administração de Alimentos e Medicamentos. Arquivado do original em 01/09/2010 . Recuperado 2010-09-09 .
  7. ^ Sistemas de segurança baseados em computador - orientação técnica para avaliar aspectos de software de sistemas de proteção baseados em computador digital, "Sistemas de segurança baseados em computador" (PDF) . Arquivado do original (PDF) em 4 de janeiro de 2013 . Acesso em 15 de maio de 2013 .
  8. ^ Posicione o papel CAST-9. Considerações para avaliar abordagens de engenharia de segurança para garantia de software Arquivado em 2013-10-06 no Wayback Machine // FAA, Certification Authorities Software Team (CAST), janeiro de 2002: "Verificação. Uma combinação de análises estáticas e dinâmicas deve ser especificada por o requerente/desenvolvedor e aplicado ao software."
  9. ^ Pesquisa VDC (2012-02-01). "Prevenção Automatizada de Defeitos para Qualidade de Software Incorporado". Pesquisa VDC. Arquivado do original em 2012-04-11 . Recuperado 2012-04-10 .
  10. Prause, Christian R., René Reiners e Silviya Dencheva. "Estudo empírico de suporte a ferramentas em projetos de pesquisa altamente distribuídos." Engenharia Global de Software (ICGSE), 2010 5ª Conferência Internacional IEEE sobre. IEEE, 2010 http://ieeexplore.ieee.org/ielx5/5581168/5581493/05581551.pdf
  11. ^ M. Howard e S. Lipner. O ciclo de vida do desenvolvimento de segurança: SDL: um processo para desenvolver software comprovadamente mais seguro. Microsoft Press, 2006. ISBN 978-0735622142 
  12. ^ Achim D. Brucker e Uwe Sodan. Implantando testes de segurança de aplicativos estáticos em grande escala Arquivado em 21/10/2014 na Wayback Machine . In GI Sicherheit 2014. Lecture Notes in Informatics, 228, páginas 91-101, GI, 2014.
  13. ^ "OMG Whitepaper | CISQ - Consórcio para Informação e Qualidade de Software" (PDF) . Arquivado (PDF) do original em 28/12/2013 . Recuperado 2013-10-18 .
  14. ^ Vijay D'Silva; e outros (2008). "Uma pesquisa de técnicas automatizadas para verificação formal de software" (PDF) . Transações em CAD. Arquivado (PDF) do original em 2016-03-04 . Recuperado 2015-05-11 .
  15. ^ Jones, Paul (2010-02-09). "Uma abordagem de verificação baseada em métodos formais para análise de software de dispositivos médicos". Projeto de Sistemas Embarcados. Arquivado do original em 10 de julho de 2011 . Recuperado 2010-09-09 .
  16. ^ ab "Aprendendo com os erros dos outros: análise de código baseada em dados" . www.slideshare.net . 13 de abril de 2015.
  17. ^ Ah, Hakjoo; Yang, Hongseok; Yi, Kwangkeun (2015). "Aprender uma estratégia para adaptar uma análise de programa via otimização bayesiana". Anais da Conferência Internacional ACM SIGPLAN 2015 sobre Programação, Sistemas, Linguagens e Aplicativos Orientados a Objetos - OOPSLA 2015. pp. 572–588. doi : 10.1145/2814270.2814309. ISBN 9781450336895. S2CID  13940725.
  18. ^ Logozzo, Francesco; Ball, Thomas (2012-11-15). "Reparo de programa automático modular e verificado". ACM SIGPLAN Avisos . 47 (10): 133–146. doi : 10.1145/2398857.2384626. ISSN  0362-1340.

Leitura adicional

  • Aywah, Nathaniel; Hovemeyer, David; Morgenthaler, J. David; Pênix, John; Pugh, Willian (2008). "Usando 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.
  • Fleming Nielson; Hanne R. Nielson; Chris Hankin (2004-12-10). Princípios de Análise de Programas (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