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. [1] [2] 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 . [3]
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 . [4] 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. [5]
- 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 . [6]
- Software de aviación (en combinación con análisis dinámico ) [7]
- 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 utilizan actualmente herramientas de análisis estático y el 39,7% espera utilizarlas en un plazo de 2 años. [8] 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). [9]
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 [10] y una práctica común en las empresas de software. [11]
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. [12]
- 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. [13]
- 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 sencilla 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 presentar o no 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: [14]
- 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). [15]
- 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. [16] [se necesita una mejor fuente ] Por ejemplo, uno puede 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. [17] 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. [18] También es posible aprender de una gran cantidad de correcciones y advertencias pasadas. [16] [se necesita una mejor fuente ]
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
- ^ Wichmann, BA; Conservas, AA; Clutterbuck, DL; Winsbarrow, LA; Ward, Nueva Jersey; Marsh, DWR (marzo de 1995). "Perspectiva industrial sobre análisis estático" (PDF) . Revista de Ingeniería de Software . 10 (2): 69–75. doi : 10.1049 / sej.1995.0010 . Archivado desde el original (PDF) el 27 de septiembre de 2011.
- ^ Egele, Manuel; Scholte, Theodoor; Kirda, Engin; Kruegel, Christopher (5 de marzo de 2008). "Una encuesta sobre técnicas y herramientas automatizadas de análisis dinámico de malware" . Encuestas de computación ACM . 44 (2): 6: 1–6: 42. doi : 10.1145 / 2089125.2089126 . ISSN 0360-0300 .
- ^ "Objetivos de calidad del software para el código fuente" Archivado el 4 de junio de 2015 en Wayback Machine (PDF). Actas: Embedded Real Time Software and Systems 2010 Conference , ERTS2010.org, Toulouse, Francia: Patrick Briand, Martin Brochet, Thierry Cambois, Emmanuel Coutenceau, Olivier Guetta, Daniel Mainberte, Frederic Mondot, Patrick Munier, Loic Noury, Philippe Spozio, Frederic Minorista.
- ^ Mejora de la seguridad del software con análisis preciso estático y en tiempo de ejecución Archivado 2011-06-05 en Wayback Machine (PDF), Benjamin Livshits, sección 7.3 "Técnicas estáticas para la seguridad". Tesis doctoral de Stanford, 2006.
- ^ FDA (08 de septiembre de 2010). "Investigación de seguridad del software de la bomba de infusión en la FDA" . Administración de Alimentos y Medicamentos. Archivado desde el original el 1 de septiembre de 2010 . Consultado el 9 de septiembre de 2010 .
- ^ Sistemas de seguridad basados en computadora: orientación técnica para evaluar los aspectos de software de los sistemas de protección basados en computadoras digitales, "Sistemas de seguridad basados en ordenador" (PDF) . Archivado desde el original (PDF) el 4 de enero de 2013 . Consultado el 15 de mayo de 2013 .
- ^ Documento de posición CAST-9. Consideraciones para evaluar los enfoques de ingeniería de seguridad para el aseguramiento de software Archivado 2013-10-06 en Wayback Machine // FAA, Equipo de software de las autoridades de certificación (CAST), enero de 2002: "Verificación. Una combinación de análisis estáticos y dinámicos debe ser especificada por el solicitante / desarrollador y se aplicó al software ".
- ^ VDC Research (1 de febrero de 2012). "Prevención automatizada de defectos para la calidad del software integrado" . Investigación de VDC. Archivado desde el original el 11 de abril de 2012 . Consultado el 10 de abril de 2012 .
- ^ Prause, Christian R., René Reiners y Silviya Dencheva. "Estudio empírico de soporte de herramientas en proyectos de investigación altamente distribuidos". Ingeniería de Software Global (ICGSE), 2010 5th IEEE International Conference on. IEEE, 2010 http://ieeexplore.ieee.org/ielx5/5581168/5581493/05581551.pdf
- ^ M. Howard y S. Lipner. El ciclo de vida del desarrollo de la seguridad: SDL: un proceso para desarrollar software demostrablemente más seguro. Microsoft Press, 2006. ISBN 978-0735622142
- ^ Achim D. Brucker y Uwe Sodan. Implementación de pruebas de seguridad de aplicaciones estáticas a gran escala Archivado el 21 de octubre de 2014 en Wayback Machine . En GI Sicherheit 2014. Lecture Notes in Informatics, 228, páginas 91-101, GI, 2014.
- ^ "Copia archivada" (PDF) . Archivado (PDF) desde el original el 28 de diciembre de 2013 . Consultado el 18 de octubre de 2013 .CS1 maint: copia archivada como título ( enlace )
- ^ Bartel, Alexandre; Klein, Jacques; Monperrus, Martin; Le Traon, Yves (1 de junio de 2014). "Análisis estático para extraer comprobaciones de permisos de un marco a gran escala: los desafíos y las soluciones para analizar Android" . Transacciones IEEE sobre ingeniería de software . 40 (6): 617–632. arXiv : 1408,3976 . doi : 10.1109 / tse.2014.2322867 . S2CID 6563188 .
- ^ Vijay D'Silva; et al. (2008). "Una encuesta de técnicas automatizadas para la verificación formal de software" (PDF) . Transacciones en CAD. Archivado (PDF) desde el original el 4 de marzo de 2016 . Consultado el 11 de mayo de 2015 .
- ^ Jones, Paul (9 de febrero de 2010). "Un enfoque de verificación basado en métodos formales para el análisis de software de dispositivos médicos" . Diseño de Sistemas Embebidos. Archivado desde el original el 10 de julio de 2011 . Consultado el 9 de septiembre de 2010 .
- ^ a b "Aprender de los errores de otros: análisis de código basado en datos" . www.slideshare.net .
- ^ Oh, Hakjoo; Yang, Hongseok; Yi, Kwangkeun (2015). "Aprendizaje de una estrategia para adaptar el análisis de un programa mediante optimización bayesiana". Actas de la Conferencia Internacional ACM SIGPLAN 2015 sobre Programación Orientada a Objetos, Sistemas, Lenguajes y Aplicaciones - OOPSLA 2015 . págs. 572–588. doi : 10.1145 / 2814270.2814309 . ISBN 9781450336895. S2CID 13940725 .
- ^ Monperrus, Martin; Mezini, Mira (2013). "Detectar llamadas a métodos faltantes como violaciones de la regla de la mayoría" . Transacciones ACM sobre Ingeniería y Metodología de Software . 22 (1): 1–25. arXiv : 1306.0762 . doi : 10.1145 / 2430536.2430541 . S2CID 1212778 .
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