2010-12-17 13 views
10

Estoy en proceso de comprender y construir una herramienta de análisis de código estático para un lenguaje propietario de una gran compañía. La razón para hacer esto es que tengo que revisar una base de código bastante grande, y un análisis de código estático ayudaría mucho y hasta ahora no tienen uno para el lenguaje.¿Cómo construir una herramienta de análisis de código estático?

Me gustaría saber cómo se hace para construir una herramienta de análisis de código estático, por ej. Pelusa o SpLint para C.

Cualesquiera libros, artículos, blogs, sitios ... etc ayudaría.

Gracias.

+1

Esta es una pregunta muy amplia, por lo que haré un comentario igualmente amplio: no olvide qué análisis no puede realizar debido al teorema de Rice. – Robert

+0

¿Qué desea analizar? –

+0

@Noon, quiero analizar los errores. – codeanalyser

Respuesta

1
  1. Obviamente necesitas un analizador para el idioma. Un buen AST de alto nivel es útil.
  2. Necesita enumerar un conjunto de "errores" en el idioma. Sin saber más sobre el idioma en cuestión, no podemos ayudar aquí. Ejemplos: punteros no asignados en C, etc.
  3. Combine el AST con los errores en el n. ° 2.
+0

¿Cómo se puede encontrar errores al usar el AST? – codeanalyser

+1

@codeanalyser: Casi no lo haces (o persigues triviales). Necesita mucho más que solo AST para cualquier tipo de análisis interesante. Consulte www.semanticdesigns.com/Products/DMS/LifeAfterParsing.html. –

3

se necesita una buena infrastructrure, tales como un analizador, un constructor de árbol, analizadores de árboles, los constructores de la tabla de símbolos, analizadores de flujo, y luego seguir adelante con su tarea específica que necesita para codificar controles específicos para los problemas específicos de interés para usted, usando toda la maquinaria de infraestructura.

Construir toda esa maquinaria de base es realmente bastante difícil, y no ayuda a hacer su tarea específica. La gente no escribe el sistema operativo para cada aplicación que codifican; ¿Por qué deberías construir toda la infraestructura? Al igual que un sistema operativo, es mejor si simplemente adquiere una buena infraestructura.

La gente le dirá que leax y yacc. Eso es como sugerir que uses la parte principal del sistema operativo en tiempo real; útil, pero lejos de toda la infraestructura que realmente necesita.

Nuestra DMS Software Reengineering Toolkit proporciona todas las infracturas necesarias. Se ha utilizado para definir many language front ends y many tools para dichos idiomas.

Tal infraestructura le permitiría definir su lenguaje no estándar específico relativamente rápido, y luego continuar con su tarea de codificar sus controles especiales.

+0

DMSToolkit me recuerda a otro framework de manipulación de lenguaje llamado Soot (http://sable.github.io/soot/). Al igual que DMSToolkit, el hollín también expone gráficos de flujo de llamadas, gráficos de flujo de control, etc. Y lo más interesante es la exposición de la representación intermedia. –

+1

El hollín es específico de Java (e IIRC, se centra en los archivos de clase en lugar del código fuente). Como tal, uno puede definir una "representación intermedia" específica para la tarea. DMS es mucho más general; opera en código fuente (nuestro dominio Java también lee archivos de clase). En lugar de una representación intermedia fija, DMS define AST y esquemas de flujo de datos, que se instancian por idioma. –

+0

@Baxter: Sí, estoy de acuerdo contigo sobre eso, Soot es específicamente para Java. Solo que la herramienta se parecía mucho a DMS, así que creo que vale la pena mencionarlo. –

4

Sé que esta es una publicación anterior, pero las respuestas realmente no parecen tan satisfactorias. This article es una muy buena introducción a la tecnología detrás de las herramientas de análisis estático, y tiene varios enlaces a ejemplos.

Un buen libro es "Programación segura con análisis estático" por Brian Chest y Jacob West.

Cuestiones relacionadas