11

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

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

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

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

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

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

4

1 回答 1

4

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

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

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

可能有更优化的方法来做到这一点。如果有人知道,请指出。

于 2017-07-24T18:27:17.167 回答