2012-01-20 14 views
5

Estoy tratando de ponerme al día sobre el uso de Clang haciendo un poco de instrumentación de código dinámico con C (y tal vez C++) donde tomo un archivo fuente y genero un resultado instrumentado. Me gustaría agregar una llamada de función al comienzo de cualquier bloque y también cambiar todas las expresiones booleanas para llamar a alguna función, así puedo rastrear eso también. Por ejemplo:Instrumentación dinámica con Clang

foo = a && (b || c); 

habría convertido en algo así como:

foo = EXPR_AND(a, EXPR_OR(b, c)); 

y por lo tanto puedo realizar un seguimiento de todas las combinaciones de condiciones que se producen.

Supongo que el uso de un RecursiveASTVisitor sería el mejor enfoque, pero ¿hay una manera fácil de generar el código C para cada nodo que visito?

¡Cualquier sugerencia de qué mirar para lograr algo como esto sería muy apreciada!

Nota: Después de algunas investigaciones adicionales, descubrí libclang que parece podría ser mi mejor amigo. Junto con un reescritor, podría tener lo que necesito. Cualquier sugerencia a buenos ejemplos (Acabo de encontrar el excelente video de reunión de desarrolladores de Apple sobre libclang) sería genial.

+0

Su propuesta transformar en gran medida cambia la semántica del código si 'B' o 'C' contener cualquier efecto secundario ... –

+0

En realidad, EXPR_AND y EXPR_OR son expansiones de macro que miran algo como: EXPR_AND #define (a, b) (a? instr [0] = 1: instr [1] = 1,0) && (b? instr [2] = 0: instr [3] = 1,0) –

Respuesta

2

Para un buen ejemplo, vea this project.

Utiliza el clang para instrumentar la función de llamada entrante y saliente, y también inspecciona los tipos de argumentos pasados.