2008-09-08 14 views
57

Hay many opciones para el análisis estático, y es un tema candente, así que:¿Qué es el análisis de código estático?

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

¿Cuándo se debe usar y cuándo no se debe usar?

¿Cuáles son los posibles problemas relacionados con el uso/la aplicación correcta e incorrecta del análisis estático?

Todos los idiomas que no tienen una buena herramienta de análisis estático, y ¿qué haces cuando no tienes una opción para el análisis automático?

-Adam

Respuesta

84

What is static analysis?

de análisis del 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.

When should you use it, and when shouldn't it be used?

Se deben usar herramientas de análisis estático cuando ayudan a mantener la calidad del código. Si se usan, deben integrarse en el proceso de compilación, de lo contrario se ignorarán.

What are potential gotchas regarding proper and improper usage/application of static analysis?

dos patologías comunes se producen cuando se utilizan herramientas de análisis estático:

  1. Las herramientas produce falsas advertencias/errores que los desarrolladores no pueden silencio. 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.

Any languages that don't have a good static analysis tool, and what do you do when you don't have an option for automated analysis?

Por una serie de razones, muchos de los lenguajes dinámicos (Ruby, Python, Perl) no tienen herramientas de análisis estático que son tan fuertes como los disponibles en las lenguas estáticas. 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).

+6

"pruebas de unidad que (en teoría) demuestran que el código realmente funciona." Para no ser pedante (ah, vale, para ser un pedante), las pruebas unitarias no "prueban" nada, ni siquiera "teóricamente". Las pruebas crean confianza en la corrección, pero no pueden cubrir todos los comportamientos del –

+1

"deben integrarse en el proceso de compilación" acordado. Sin embargo, las versiones de depuración y liberación, o una u otra? –

+1

@ChrisConway Untrue; si utiliza pruebas sistemáticas o condiciones pre/post para reducir una función parcial o total dada, puede usar pruebas unitarias para probar exhaustivamente esos casos (y, por lo tanto, tener una prueba inductiva de que el código hace lo que dice que hace). Si bien esto no es fácil para muchas funciones a gran escala o que valgan la pena, seguramente es posible, tanto teórica como prácticamente. – Alice

2

El análisis estático analiza el código fuente para detectar posibles problemas. Se llama static 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 olvidarse de intentar 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í está una lista de productos libres que he utilizado personalmente:

  • FindBugs (Java)
  • FXCop (NET)
  • pylint (Python)

puedo recomendar a todos ellos .

+1

El análisis estático no necesita mirar el código fuente. Bien puede ver el código objeto o intermedio. Por ejemplo, mencionas FindBugs que mira archivos de clase (bytecode). –

+2

Análisis estático, inmaduro? Veo que nunca usó IntelliJ IDEA ...; ^) –

+2

Sí, Tom Reps dio una charla la semana pasada en Stanford sobre análisis estático de código máquina, http://www.cs.wisc.edu/wpis/abstracts/wysinwyx. submission.abs.html. Para ver un ejemplo de vulnerabilidad no visible en el origen, consulte , , , y . –

0

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 "Secure Programming with Static Analysis" de Brian Chess del software Fortify.

1

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 protección. 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 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.

Técnicas sofisticadas unen el análisis de 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. P.ej. estas técnicas pueden probar que la siguiente línea de código nunca fallará con una división por cero error en tiempo de ejecución:

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

En el análisis general, la estática se debe utilizar al principio del proceso de desarrollo, de preferencia antes de prueba de unidad. 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.

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

19

What is static analysis?

El análisis estático nos permite razonar sobre todas las posibles ejecuciones de un programa. Se da la seguridad sobre cualquier ejecución, antes del despliegue pero las herramientas comerciales gastar un montón de esfuerzo frente a la confusión desarrollador, los falsos positivos, etc

What are potential gotchas regarding proper and improper usage/application of static analysis?

tema 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. abstracciones de análisis estático no coinciden limpia abstracciones desarrollador

When should you use it, and when shouldn't it be used?

propósito principal es para la prueba de código y de mantenimiento, ya que encaja bien con intuiciones desarrollador. 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 utilizando variables simbólicas desconocidas en evaluación donde rastreamos 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 (por ejemplo, si un punto del programa es accesible, si el acceso a la matriz es A [i] fuera de límites, etc.).

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 este sencillo ejemplo de código: Static code Analysis

Éstos son algunos enlaces útiles para resolver SMT/SAT que se utilizan para el análisis de código estático:

SAT solving, SMT solving and Program Verification

List of tools for Static Code Analysis

Symbolic Execution, SAT solving, SMT solving and Program Verification

Symbolic Execution Harvard CS252r

+0

Creo que esto muestra cómo "Análisis estático" se usa para significar muchas cosas diferentes por diferentes personas. Para mí, SA es una mezcla de esto junto con gran parte de la respuesta de AaronMaenpaa (http://stackoverflow.com/a/49731/11698). –

+0

@Geo, ¿qué significa la marca y las cruces en ese diagrama? – Pacerier

+0

@Pacerier Observe que el 'assert (x + y + z! = 3)' se convierte en 'False' en esa ruta específica con la cruz roja. – BugShotGG

Cuestiones relacionadas