Análisis de programa estático - Static program analysis

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:

  1. 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.
  2. 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 .
  3. Software de aviación (en combinación con análisis dinámico )
  4. 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:

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

Referencias

Otras lecturas

enlaces externos