我遇到了一个关于如何编写一个会改变代码的clang插件的问题。 我想为程序注入一些代码,就像这样:在这里输入代码
//the original code
//the filename is user_code.cpp
int f1(){
return 1;
}
int f2(){
return 2;
}
int f3(){
return 3;
}
int main(){
for(int i=0;i<1000;i++)f1();
for(int i=0;i<10000;i++)f2();
for(int i=0;i<100000;i++)f3();
return 0;
}
//the injected code
int function_counter[3];
int f1(){
function_counter[0]++;
return 1;
}
int f2(){
function_counter[1]++;
return 2;
}
int f3(){
function_counter[2]++;
return 3;
}
int main(){
for(int i=0;i<1000;i++)f1();
for(int i=0;i<10000;i++)f2();
for(int i=0;i<100000;i++)f3();
return 0;
}
现在,我可以通过将此代码解析为AST并遍历它,使用ReWriter类修改代码,最后将修改后的代码重写为新文件来实现。但这对user.i要求不透明写一个clang插件,用户只需输入命令:
clang -load myplugin.so -plugin myplugin user_code.cpp -o user_code.o
首先可以透明地注入代码,然后像usualy一样编译。我可以做什么?有什么建议吗?