如何利用Clang的AST?

24

我希望利用Clang的AST来进行C代码分析。 对于如何开始、获取Clang的AST、教程或任何相关内容的指针,会非常有帮助!!!

我一直在尝试寻找这方面的教程,我找到了这个链接(link),但由于某些原因,它对我不起作用。 教程中的示例代码给我太多的错误信息。 因此,我不确定是否正确构建了代码或者教程有问题。 但我也很乐意从其他页面开始学习。

4个回答

15

首先看一下sharth提供的教程链接,然后仔细阅读Clang的Doxygen文档。从SemaConsumer开始。

多阅读源代码。Clang是一个不断发展的目标。如果您正在基于Clang编写工具,那么您需要认识到Clang每天都在添加和修复功能,所以您应该准备阅读大量的代码!


9
您可能希望使用libclang库提供的稳定C API,而不是其他人提到的不稳定的C++内部API。
目前最好的文档是“libclang: Thinking Beyond the Compiler”的视频/幻灯片,可在LLVM Developers Meeting website上找到。
但请注意,API的稳定性是以全面性为代价的。您将无法使用此API完成everything,但它更易于使用。

2
要获取AST并了解前端阶段的流程,可以在书籍“LLVM核心库”中找到前端章节。基本上它有这样一个流程(在llvm-4.0.1的情况下,后续版本应该类似):
- `cc1_main.cpp:cc1_main (ExecuteCompilerInvocation)` - `CompilerInstance.cpp:CompilerInstance::ExecuteAction` - `ParseAST.cpp:clang::ParseAST (Consumer>HandleTranslationUnit(S.getASTContext())` - `CodeGenAction.cpp:HandleTranslationUnit`
最后一个函数处理整个翻译单元(顶层声明在此时已经处理完毕),并调用`EmitBackendOutput`来进行后端处理。因此,这个函数是一个很好的地方,在发出后端输出之前对完整的AST进行操作。
关于如何操纵AST,clang有一些基本的教程:http://clang.llvm.org/docs/RAVFrontendAction.html
还要看看`ASTDumper.cpp`。它是访问AST的最佳示例。
另一个好的教程:https://jonasdevlieghere.com/understanding-the-clang-ast/ 通过三种不同的方法教你如何在AST中找到特定的调用表达式。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接