software reglas pruebas mecanica herramientas estructuras estatico dinamico codigo analisis code-review static-analysis

code-review - reglas - pruebas codigo estatico



¿Qué es el análisis de código estático? (7)

Además de encontrar errores en su código (como desreferenciación de puntero nulo garantizado, bucles infinitos, etc.), el análisis estático se puede utilizar para el análisis de seguridad del código. Recomiendo encarecidamente ver la presentación "Programación segura con análisis estático" de Brian Chess del software Fortify.

Hay muchas opciones para el análisis estático, y es un tema candente, así que:

¿Qué es el análisis estático?

¿Cuándo debería usarlo y cuándo no debería usarse?

¿Cuáles son los posibles problemas con respecto al uso / aplicación adecuada e incorrecta del análisis estático?

¿Algún idioma que no tiene una buena herramienta de análisis estático y qué hace cuando no tiene una opción para el análisis automatizado?

-Adán


El análisis estático analiza el código fuente para detectar posibles problemas. Se llama estático porque el código no se ejecuta para encontrar los problemas, la fuente se analiza analíticamente.

Por el momento, el análisis estático es muy inmaduro. La mayoría de las herramientas solo encuentran los errores más estúpidos. Por ejemplo, ninguna herramienta de la que yo sepa puede encontrar todas las desreferencias de puntero nulo, pero este es un error obvio al que le gustaría apuntar con análisis estático. Puede olvidar tratar de encontrar errores más difíciles, como las condiciones de carrera con análisis estático, al menos por el momento.

El análisis estático es particularmente útil para aplicar los estándares de codificación. FXCop, que analiza el código .NET, contiene reglas para todo tipo de defectos en las normas de codificación.

Como dices, hay muchas herramientas que hacen análisis estáticos. Aquí hay una lista de productos gratis que personalmente he usado:

  • FindBugs (Java)
  • FXCop (.NET)
  • PyLint (Python)

Puedo recomendarlos a todos.



¿Qué es el análisis estático?

Analizando código sin ejecutarlo. Generalmente se usa para encontrar errores o garantizar el cumplimiento de las pautas de codificación. El ejemplo clásico es un compilador que encuentra errores léxicos, sintácticos e incluso algunos errores semánticos.

¿Cuándo debería usarlo y cuándo no debería usarse?

Las herramientas de análisis estáticos deberían usarse cuando ayudan a mantener la calidad del código. Si se utilizan, deben integrarse en el proceso de compilación, de lo contrario serán ignorados.

¿Cuáles son los posibles problemas con respecto al uso / aplicación adecuada e incorrecta del análisis estático?

Dos patologías comunes ocurren cuando se usan herramientas de análisis estático:

  1. Las herramientas producen advertencias / errores espurios que los desarrolladores no pueden silenciar. Finalmente, la mayoría de las advertencias son falsas y los desarrolladores dejan de prestar atención a la salida. Esta es la razón por la cual muchos equipos requieren que el código se compile limpiamente. Si los desarrolladores se sienten cómodos ignorando las advertencias del compilador, la fase de compilación se llenará con una advertencia a la que nunca se le presta atención, aunque puedan ser errores.

  2. Las herramientas tardan demasiado en ejecutarse y los desarrolladores nunca se molestan en ejecutarlas.

¿Algún idioma que no tiene una buena herramienta de análisis estático y qué hace cuando no tiene una opción para el análisis automatizado?

Por una serie de razones, muchos de los lenguajes dinámicos (ruby, python, perl) no tienen herramientas de análisis estáticas que sean tan sólidas como las disponibles en los lenguajes estáticos. El método estándar para encontrar errores y asegurarse de que el código esté funcionando en idiomas dinámicos son las pruebas unitarias que ayudan a construir la confianza de que el código realmente funciona (hat-tip: Chris Conway).


El análisis estático (también conocido como análisis de código estático, análisis de código fuente, análisis de programa estático) es una actividad de verificación de software en la que se analiza el código fuente en cuanto a calidad, seguridad y seguridad. Este análisis permite a los desarrolladores y probadores de software identificar y diagnosticar varios tipos de errores / fallas tales como desbordamientos, división por cero, errores de memoria y de puntero, errores de tiempo de ejecución y otros problemas.

Las métricas producidas por el análisis de código estático proporcionan un medio por el cual la calidad del software se puede medir y mejorar. A diferencia de otras técnicas de verificación, el análisis estático es automático y, por lo tanto, puede realizarse sin ejecutar el programa o desarrollar casos de prueba.

Las técnicas sofisticadas combinan el análisis del código estático con métodos formales. Los métodos formales aplican los fundamentos teóricos de la informática para resolver problemas difíciles en el software, como probar que el software no fallará con un error de tiempo de ejecución. La combinación de análisis de código estático y métodos formales permite a los desarrolladores detectar errores difíciles de encontrar y demostrar la ausencia de ciertos tipos de errores / errores. Por ejemplo, estas técnicas pueden demostrar que la siguiente línea de código nunca fallará con un error de división por cero en tiempo de ejecución:

int x, y; ... x = x / (x - y);

En general, el análisis estático debe usarse al principio del proceso de desarrollo, preferiblemente antes de la prueba unitaria. Esto permite el desarrollo de código robusto. El análisis estático también se puede combinar con los sistemas de compilación para generar métricas de calidad y proporcionar orientación sobre la seguridad y la fiabilidad del software. Sin embargo, el uso tardío del análisis estático en general puede requerir más tiempo y recursos para abordar los problemas identificados.

Una variedad de herramientas de análisis estático de código abierto, académicas y comerciales están disponibles. La mayoría de los idiomas son compatibles. Obtenga más información sobre este tema en los siguientes enlaces


¿Qué es el análisis estático?

El análisis estático nos permite razonar sobre todas las ejecuciones posibles de un programa. Proporciona seguridad sobre cualquier ejecución, antes de la implementación, pero las herramientas comerciales emplean mucho esfuerzo para tratar la confusión del desarrollador, los falsos positivos, etc.

¿Cuáles son los posibles problemas con respecto al uso / aplicación adecuada e incorrecta del análisis estático?

El problema principal es la abstracción. La abstracción nos permite escalar y modelar todas las carreras posibles, pero debe ser conservador, tratando de equilibrar la precisión y la escalabilidad. Las abstracciones de análisis estático no coinciden limpiamente con las abstracciones de los desarrolladores

¿Cuándo debería usarlo y cuándo no debería usarse?

El objetivo principal es la prueba y el mantenimiento del código, ya que se adapta bien a las intuiciones de los desarrolladores. En la práctica, es la forma más común de detección de errores, pero cada prueba explora solo una posible ejecución del sistema. Los desarrolladores que están en la industria de seguridad usan esto como una herramienta principal para explorar errores de código, exploits, etc.

Aquí hay un ejemplo de análisis estático usando la ejecución simbólica, donde la idea clave es generalizar las pruebas mediante el uso de variables simbólicas desconocidas en la evaluación, donde rastreamos los estados simbólicos. Si la ruta de ejecución depende de desconocido, utilizamos el ejecutor simbólico. Durante la ejecución simbólica, estamos tratando de determinar si ciertas fórmulas son satisfactorias (p. Ej., ¿Se puede acceder a un punto particular del programa? ¿Está fuera de límites A? I).

int a = α, b = β, c = γ; // symbolic int x = 0, y = 0, z = 0; if (a) { x = -2; } if (b < 5) { if (!a && c) { y = 1; } z = 2; } assert(x+y+z!=3)

Y el análisis de esta simple muestra de código:

Aquí hay algunos enlaces útiles para los solucionadores de SMT / SAT que se utilizan para el análisis de código estático:

Resolución de SAT, resolución de SMT y verificación de programa

Lista de herramientas para el análisis de código estático

Ejecución simbólica, resolución SAT, resolución SMT y verificación de programa

Ejecución simbólica Harvard CS252r