我是 clang 的新手,需要一些帮助来为我正在开发的自定义覆盖工具重写 c 和 c++ 代码。据我了解,我认为我需要链接到 clang 的 libTooling 来制作一个独立的可执行文件来制作类似代码重写器的东西。
LLVM 和 clang 非常庞大,让人不知从何下手。有:
似乎所有人都在做类似的事情。
到目前为止,我重写一些简单代码的最佳方法是遵循旧教程tutorial和这个3部分教程-第1部分.
作为一个简单的例子,我希望能够采用如下一些简单的 C 代码:
#include <stdarg.h>
// example global function
int
foo(int* a, int *b) {
if (a[0] > 1) {
b[0] = 2;
} else if ((a[0] == 1) && (b[0] == 2)) {
b[0] = 3;
} else {
b[1] = -1;
}
a[0] = 2;
switch (a[0]) {
case 0:
case 1:
break;
case 2:
break;
default:
break;
}
return 3;
}
int main(int argc, const char **argv) {
int a[3] = {0};
int b[3] = {0};
return foo(a, b);
}
按照以下几行修改它(使用大写代码插入):
#INCLUDE <CUSTOM_MACROS_AND_INLINES>
#include <stdarg.h>
// example global function
int
foo(int* a, int *b) {
_BREADCRUMB;
if (_BREADCRUMB(a[0] > 1)) {
b[0] = 2;
} else if (_BREADCRUMB(a[0] == 1) && _BREADCRUMB(b[0] == 2)) {
b[0] = 3;
} else {
b[1] = -1;
_BREADCRUMB;
return 1;
}
a[0] = 2;
switch (a[0]) {
case 0:
_BREADCRUMB
case 1:
_BREADCRUMB
break;
case 2:
_BREADCRUMB
break;
default:
_BREADCRUMB
break;
}
_BREADCRUMB;
return 3;
}
int main(int argc, const char **argv) {
_BREADCRUMB;
int a[3] = {0};
int b[3] = {0};
_BREADCRUMB;
return foo(a, b);
}
使用 RecursiveASTVisitor 技术,我发现很难控制在重写输出中插入文本的位置。特别是尝试在函数的左括号之后插入,这样我就可以将上面的面包屑字符串放入重写的代码中。