我遇到了关于如何编写会更改代码的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 类修改代码,最后将修改后的代码重写为新文件。但这对用户不透明。我想写一个 clang插件,用户只需输入命令:
clang -load myplugin.so -plugin myplugin user_code.cpp -o user_code.o
代码首先可以透明地注入,然后像往常一样编译。我能做什么?有什么建议吗?