2012-01-20 66 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爲了調用函數進入和退出,還檢查傳遞參數的類型。