c++ - LLVM Clang C++ 代码注入(inject)

标签 c++ code-injection llvm-clang

我对在 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/

相关文章:

c++ - 友元函数和声明

c++ - 可变参数模板构造函数的推导指南失败

javascript - 拒绝执行 JavaScript 脚本。在请求中找到的脚本源代码

clang - 使用 CCMAKE 将 Clang 设置为自己的编译器后出现 ninja 错误

docker -/usr/lib/x86_64-linux-gnu/libLLVM-4.0.so.1 : version `LLVM_4.0' not found

c++ - 禁止在 clang 前端查找预编译头文件

c++ - 排序链表在每次执行时插入重复项

c++ - 连接c++文件和gnuplot并在执行后自动绘图

c++ - 可以按序号挂接 IAT 函数吗?

java - Spring 3 JavaConfig - 注入(inject)数据源时出现问题