c - 使用链接器命令进行 clang 静态分析

标签 c clang static-analysis call-graph

我正在使用 python-clang-3.6 库开发一个静态分析工具,它可以让我绘制函数调用图。

要正确创建 TranslationUnit,我需要使用相应的编译命令(即 clang.cindex.Index.parse(c_file, compile_command) )。但是,我相信,为了能够正确互连 TranslationUnits,我还需要使用链接器命令来了解哪个 TranslationUnit 使用来自其他 TranslationUnits 的函数.这是我项目中的一个问题,实际上有多个二进制文件是通过单个“make”调用构建的,一些 TranslationUnits 可能有冲突的符号名称,所以我不能假设它们都是相互联系。

解决此问题的最佳方法是什么,以便我的工具知道 C 文件中的哪些函数可以调用其他 C 文件中的函数?

现在我看到两个选项:

  1. 以某种方式检索和使用链接器命令;这个选项看起来很棘手,因为它在 clang(至少是 clang python 库)中没有直接支持;或
  2. 在遍历TranslationUnit 的AST 树时,记住函数声明在头文件中的位置。如果由于宏处理我会得到不同的行号或对不同的 TranslationUnits 有隐式函数声明,这个选项似乎很棘手。

还有其他选择吗?哪个选项以及为什么会选择您?

最佳答案

我不确定是否有必要使用 clang 从源中提取信息,或者您是否可以简单地从生成的二进制文件中提取信息。

如果你想查看二进制文件中使用的符号,你可以使用

readelf -s <file>

这列出了符号表,您可以提取符号是由二进制文件提供还是需要(导入)。

使用

readelf -d <file> | grep NEEDED

你会得到一个依赖库的列表。

关于c - 使用链接器命令进行 clang 静态分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31124406/

相关文章:

c++ - 如何从我的 Visual Studio 静态代码分析中排除库 header ?

c# - IDisposable 在方法中创建并返回

.net - 在 Linux 平台上使用 SonarQube 分析 .NET 代码

c - 在循环范围外使用局部变量

将整数转换并存储为 char 指针

objective-c - 为一个类禁用 Objective-C 自动属性合成?

ios - Xcode 警告 : Not such file or directory (. pcm 文件)

在标签上捕捉 WM_LBUTTONDOWN?

android - 适用于 Android C/C++ 的 Eclipse CDT

c++ - 如何在 Mac OS X Mavericks 上链接标准 C++ 库?