带有clang的多个源文件的AST

时间:2013-02-15 11:50:40

标签: c clang static-analysis abstract-syntax-tree

我正在用clang进行程序间数据流分析。目前我正在使用libtooling来解析源文件并调用AST访问者。 问题是如何为几个.c文件创建单个AST?

我尝试使用ASTImport类,但它不支持导入某些AST节点。此外,当我创建和操作CompilerIstance并且它在析构函数中崩溃时,我做错了。

一个非常类似的选项是ASTImportAction但是我不太清楚在这种情况下应该将哪些命令行参数传递给ClangTool。

第三个选项是为每个.c文件创建ASTUnits并在每个文件中查找定义,不清楚如何找到用户定义类型之间的对应关系,例如记录。在ASTImport中,它们使用IsStructurallyEquivalent()函数,但它在匿名命名空间中声明,因此我只能将所有这些代码复制到我的程序中。并且它不再支持所有AST节点。

在互联网上,这个链接http://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-August/023865.html似乎是最合适的,但对我来说,解决方案的技术细节并不清楚。

欢迎任何建议。 非常感谢。

1 个答案:

答案 0 :(得分:3)

我试图做类似的事情。我没有尝试创建一个AST。我正在解析多个AST并试图自己映射这些函数。 我正在使用AST匹配器来获取函数调用,然后在其他AST中检查它们。

我使用compile_commands.json文件来提供源文件列表。 OptionsParser.getCompilations()。getAllFiles()可以获取compile_commands.json中指定的所有源文件。

当我们创建一个clangTool并使用我们的匹配器在该工具上运行frontendAction时,它会在所有源文件中搜索匹配项。

可能有更优化的方法。如果有人知道它,请指出。