Análisis de programa estático - Static program analysis
Desarrollo de software |
---|
El análisis estático de programas es el análisis de software de computadora que se realiza sin ejecutar programas, en contraste con el análisis dinámico , que es el análisis que se realiza en los programas mientras se ejecutan. En la mayoría de los casos, el análisis se realiza en alguna versión del código fuente y, en los otros casos, en alguna forma del código objeto .
El término generalmente se aplica al análisis realizado por una herramienta automatizada , y el análisis humano se denomina comprensión del programa , comprensión del programa o revisión del código . En este último caso también se utilizan inspecciones de software y recorridos de software .
Razón fundamental
La sofisticación del análisis que realizan las herramientas varía desde aquellas que solo consideran el comportamiento de enunciados y declaraciones individuales, hasta aquellas que incluyen el código fuente completo de un programa en su análisis. Los usos de la información obtenida del análisis varían desde resaltar posibles errores de codificación (p. Ej., La herramienta lint ) hasta métodos formales que prueban matemáticamente las propiedades de un programa dado (p. Ej., Su comportamiento coincide con el de su especificación).
Las métricas de software y la ingeniería inversa se pueden describir como formas de análisis estático. Las métricas de software derivadas y el análisis estático se implementan cada vez más juntos, especialmente en la creación de sistemas integrados, mediante la definición de los denominados objetivos de calidad del software .
Un uso comercial creciente del análisis estático es la verificación de las propiedades del software utilizado en los sistemas informáticos críticos para la seguridad y la localización de códigos potencialmente vulnerables . Por ejemplo, las siguientes industrias han identificado el uso del análisis de código estático como un medio para mejorar la calidad de software cada vez más sofisticado y complejo:
- Software médico : La Administración de Drogas y Alimentos de los Estados Unidos (FDA) ha identificado el uso de análisis estático para dispositivos médicos.
- Software nuclear: en el Reino Unido, la Oficina de Regulación Nuclear (ONR) recomienda el uso de análisis estático en los sistemas de protección de reactores .
- Software de aviación (en combinación con análisis dinámico )
- Automotriz y máquinas (las características de seguridad funcional forman una parte integral de cada fase de desarrollo de productos automotrices, ISO 26262 , Sec 8.)
Un estudio realizado en 2012 por VDC Research informó que el 28,7% de los ingenieros de software integrado encuestados actualmente utilizan herramientas de análisis estático y el 39,7% espera utilizarlas en un plazo de 2 años. Un estudio de 2010 encontró que el 60% de los desarrolladores entrevistados en proyectos de investigación europeos hicieron al menos uso de sus analizadores estáticos integrados IDE básicos. Sin embargo, solo alrededor del 10% empleó otra herramienta de análisis adicional (y quizás más avanzada).
En la industria de la seguridad de aplicaciones, también se utiliza el nombre Prueba de seguridad de aplicaciones estáticas (SAST). SAST es una parte importante de los ciclos de vida de desarrollo de seguridad (SDL), como el SDL definido por Microsoft y una práctica común en las empresas de software.
Tipos de herramientas
El OMG ( Object Management Group ) publicó un estudio sobre los tipos de análisis de software necesarios para la medición y evaluación de la calidad del software . Este documento sobre "Cómo ofrecer sistemas de TI resistentes, seguros, eficientes y que se cambian fácilmente de acuerdo con las recomendaciones de CISQ" describe tres niveles de análisis de software.
- Nivel de unidad
- Análisis que tiene lugar dentro de un programa o subrutina específico, sin conectarse al contexto de ese programa.
- Nivel de tecnología
- Análisis que tiene en cuenta las interacciones entre programas de unidad para obtener una visión más holística y semántica del programa en general con el fin de encontrar problemas y evitar falsos positivos obvios. Por ejemplo, es posible analizar estáticamente la pila de tecnología de Android para encontrar errores de permisos.
- Nivel del sistema
- Análisis que tiene en cuenta las interacciones entre programas unitarios, pero sin limitarse a una tecnología o lenguaje de programación específico.
Se puede definir un nivel adicional de análisis de software.
- Misión / Nivel de negocio
- Análisis que toma en cuenta los términos, reglas y procesos de la capa de negocio / misión que se implementan dentro del sistema de software para su operación como parte de las actividades de la capa de empresa o programa / misión. Estos elementos se implementan sin limitarse a una tecnología o lenguaje de programación específicos y, en muchos casos, se distribuyen en varios lenguajes, pero se extraen y analizan estáticamente para la comprensión del sistema para garantizar la misión.
Métodos formales
Los métodos formales es el término que se aplica al análisis de software (y hardware de computadora ) cuyos resultados se obtienen puramente mediante el uso de métodos matemáticos rigurosos. Las técnicas matemáticas utilizadas incluyen semántica denotacional , semántica axiomática , semántica operacional e interpretación abstracta .
Mediante una simple reducción al problema de la detención , es posible probar que (para cualquier lenguaje completo de Turing ), encontrar todos los posibles errores de tiempo de ejecución en un programa arbitrario (o más generalmente cualquier tipo de violación de una especificación en el resultado final de un programa) es indecidible : no existe un método mecánico que siempre pueda responder con sinceridad si un programa arbitrario puede o no presentar errores en tiempo de ejecución. Este resultado data de los trabajos de Church , Gödel y Turing en la década de 1930 (ver: Problema de detención y teorema de Rice ). Como ocurre con muchas preguntas indecidibles, todavía se puede intentar dar soluciones aproximadas útiles.
Algunas de las técnicas de implementación del análisis estático formal incluyen:
- Interpretación abstracta , para modelar el efecto que cada declaración tiene sobre el estado de una máquina abstracta (es decir, "ejecuta" el software basándose en las propiedades matemáticas de cada declaración y declaración). Esta máquina abstracta se aproxima en exceso a los comportamientos del sistema: el sistema abstracto se hace así más simple de analizar, a expensas de la incompletitud (no todas las propiedades verdaderas del sistema original son verdaderas del sistema abstracto). Sin embargo, si se hace correctamente, la interpretación abstracta es sólida (cada propiedad verdadera del sistema abstracto puede asignarse a una propiedad verdadera del sistema original).
- Análisis de flujo de datos , una técnica basada en celosía para recopilar información sobre el posible conjunto de valores;
- Lógica Hoare , un sistema formal con un conjunto de reglas lógicas para razonar rigurosamente sobre la corrección de los programas de computadora . Hay soporte de herramientas para algunos lenguajes de programación (por ejemplo, el lenguaje de programación SPARK (un subconjunto de Ada ) y el lenguaje de modelado Java —JML — usando ESC / Java y ESC / Java2 , el complemento Frama-C WP ( condición previa más débil ) para C lenguaje extendido con ACSL ( lenguaje de especificación ANSI / ISO C )).
- Verificación de modelos , considera sistemas que tienen un estado finito o que pueden reducirse a un estado finito por abstracción ;
- Ejecución simbólica , utilizada para derivar expresiones matemáticas que representan el valor de variables mutadas en puntos particulares del código.
Análisis estático basado en datos
El análisis estático basado en datos utiliza grandes cantidades de código para inferir reglas de codificación. Por ejemplo, se pueden usar todos los paquetes de código abierto de Java en GitHub para aprender una buena estrategia de análisis. La inferencia de reglas puede utilizar técnicas de aprendizaje automático. Por ejemplo, se ha demostrado que cuando uno se desvía demasiado en la forma en que usa una API orientada a objetos, es probable que haya un error. También es posible aprender de una gran cantidad de correcciones y advertencias pasadas.
Ver también
- Auditoría de código
- Generador de documentación
- Semántica formal de lenguajes de programación
- Verificación formal
- Lista de herramientas para el análisis de código estático
- Análisis de formas (software)
- Calidad del software
- Aseguramiento de la calidad del software
- ISO 26262
- ISO 9126 (ahora serie ISO 25000)
- Pelusa (software)
Referencias
Otras lecturas
- Ayewah, Nathaniel; Hovemeyer, David; Morgenthaler, J. David; Penix, John; Pugh, William (2008). "Uso de análisis estático para encontrar errores". 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). Programación segura con análisis estático . Addison-Wesley. ISBN 978-0-321-42477-8.
- Flemming Nielson; Hanne R. Nielson; Chris Hankin (10 de diciembre de 2004). Principles of Program Analysis (1999 (corregido en 2004) ed.). Saltador. ISBN 978-3-540-65410-0.
- "Interpretación abstracta y análisis estático", Escuela Internacional de Invierno sobre Semántica y Aplicaciones 2003, por David A. Schmidt
enlaces externos
- Mejora de la calidad del código: verificación de conformidad con los estándares de codificación (DDJ)
- Competencia de verificación de software (SV-COMP)
- Episodio 59: Entrevista de análisis de código estático ( podcast ) en Software Engineering Radio
- Implementación de la gobernanza automatizada para los estándares de codificación Explica por qué y cómo integrar el análisis de código estático en el proceso de compilación
- Integrar el análisis estático en un proceso de desarrollo de software
- El proyecto SAMATE , un recurso para herramientas de análisis estático automatizado
- Una introducción práctica al análisis de código estático