2012-01-20 119 views
5

我想通过做一点动态代码工具与C(也许C++),我采取源文件并生成一个仪器化的输出来使用Clang的速度。我想在任何块的开头添加一个函数调用,并且更改所有布尔表达式来调用某个函数,以便我也可以跟踪它。例如:动态仪器与叮铛

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

将成为类似:

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

,因此我可以跟踪发生的条件的所有组合。

我假设使用RecursiveASTVisitor是最好的方法,但是有没有简单的方法来输出我访问的每个节点的C代码?

任何有关如何完成此类任务的建议都将非常感谢!

注意:经过一些进一步调查,我刚刚发现libclang,看起来它可能是我最好的朋友。加上一个重写器,我可能只是有我需要的东西。任何指向良好示例的指针(我只是找到了优秀的Apple开发人员在libclang上会见视频)会很棒。

+0

你提出的改造极大地改变了代码的语义如果'B'或'C'包含任何副作用...... –

+0

其实,EXPR_AND和EXPR_OR是看起来像宏展开: 的#define EXPR_AND(A,B )(a?instr [0] = 1:instr [1] = 1,0)&&(b?instr [2] = 0:instr [3] = 1,0) –

回答

2

有一个很好的例子,请参阅this project

它使用clang为了调用函数进入和退出,还检查传递参数的类型。