gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:08:29 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com