我对在 LLVM Clang 中实现代码注入(inject)功能有点困惑。我基本上想在源代码中创建变量或指针之前添加一个函数。示例:
#include <iostream>
int main() {
int a;
return 0;
}
到
#include <iostream>
int main() {
foo();
int a;
return 0;
}
我阅读了 LLVM 文档来寻找答案,但没有找到。请帮我。 预先感谢您。
最佳答案
第一步是决定是否要在 Clang 或 LLVM 中执行此操作。虽然它们是“相连的”,但它们并不是同一件事。在 clang 中,您可以在 AST 级别执行此操作,在这种情况下,您需要编写一个递归 AST 访问器,并从中识别您想要检测的函数定义 - 插入 AST 来调用您的 foo
功能。这仅适用于编译器实现的函数。
这里有关于如何编写此类访问者的信息: https://clang.llvm.org/docs/RAVFrontendAction.html
在 LLVM 中,您可以编写一个函数传递,将代码插入到每个函数中。这显然适用于任何功能,无论语言如何。
如何编写 LLVM 传递: http://llvm.org/docs/WritingAnLLVMPass.html
然而,虽然一开始这看起来微不足道,但有一些有趣的怪癖。在 LLVM 函数中,alloca
说明应该放在第一位,因此您必须“跳过”这些功能。可能有些函数“不应该被检测” - 例如,如果您的函数 foo
使用 cout << something;
打印一些内容,插入 foo
将是相当糟糕的主意进入operator<<(ostream&, ...)
输入函数...;)并且您显然不想检测 foo
本身或它调用的任何函数。
Clang 中有一些方法可以确定源是“主文件”还是某个头文件 - 尽管这对于您的情况可能还不够。在 LLVM 中确定“这是哪个函数”要困难得多。
关于c++ - LLVM Clang C++ 代码注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49472790/