【问题标题】:Generating call graph for C code [closed]为 C 代码生成调用图 [关闭]
【发布时间】:2012-07-25 02:18:54
【问题描述】:

我正在编写一个工具,我需要为一些 C 项目生成调用图。 我能够使用 clang 生成一个文件的调用图,但我无法找到如何在包含数十个头文件和源文件的整个项目中生成调用图。

任何可以将调用图生成到可以解析的文件的工具都可以。一个可用的库会更好。

【问题讨论】:

  • 通过指向函数的指针间接调用可能会使这成为一项艰巨的任务。对于其他调用,创建汇编代码和处理将是使用自写脚本实现此目的的一种方式。
  • 你已经有了一个 doxygen 标签 - 我相信它可以在 XML 中转储调用图......你知道吗?如果是这样,你能解释一下它有什么问题吗?
  • @MvG 这看起来是个好主意
  • @Tony 是的,我知道它可以在 xml 中生成它,但我想知道是否有 doxygen 提供的库,我可以使用它来自动化这个过程,而无需用户打开 doxygen 并生成自己归档。
  • 还有一个想法:ld --gc-sections 一定也在做某种调用图分析。不确定您是否可以对此有所了解,但可能有办法。可能也不会真正处理间接调用,但它可能能够决定某些代码何时获取函数的地址,以便稍后调用它。

标签: c parsing clang doxygen call-graph


【解决方案1】:

另外值得一提的是,优秀的GNU cflow

GNU cflow 分析一组 C 源文件并打印一个图表,绘制程序内的控制流图表。

GNU cflow 能够为 C 源代码生成直接流程图和反向流程图。可以选择生成交叉引用列表。实现了两种输出格式:POSIX 和 GNU(扩展)。

可以选择在分析之前对输入文件进行预处理。

编辑
至于图书馆的要求。您可能想“调整”output.c,而不是打印对数据做其他事情。内部流程被组织成输出处理程序,所以我认为编写自己的处理程序已经可以解决问题。但它不是开箱即用的。

【讨论】:

    【解决方案2】:

    把我的评论变成答案。

    您可以查看程序集输出并使用脚本对其进行处理。假设 gcc 在 linux 上,您将 -S 标志传递给 gcc 并使用以下内容处理结果:

    perl -ne '/^([^. \t#].*):/ and $f=$1;/call\s+([^*]\S*)/ and print "$f -> $1\n";' *.S
    

    这将为每个静态调用提供一行,包含调用和被调用的函数。您可以在其周围添加一些样板文件并将结果提供给dot,或者您想用它做什么。

    您也可以省略正则表达式的“不得以星号开头”部分,以获得间接调用的一些指示。您仍然无法知道此时将调用 什么 函数,但至少您会知道还有更多内容需要了解。

    【讨论】:

    • 正如你所指出的,这不处理间接函数调用。
    • @IraBaxter,给我 any 声称可以处理间接函数调用的解决方案,而无需 运行 应用程序和记录实际调用,我会编写一个应用程序,该应用程序具有该工具无法预测的调用。 C 指针是黑魔法,你可以用它们做任何事情。
    • 每当你为代码构建一个静态分析器时,你会得到一个准确性有限的结果;这不仅仅是“指针”,而是您正在处理图灵机的事实。是的,你几乎总是可以愚弄它。对于大多数代码,您可以获得相当合理的答案,否则没有人会使用静态分析工具。阅读“保守流动分析”。
    猜你喜欢
    • 2015-06-11
    • 2011-11-17
    • 2011-07-19
    • 1970-01-01
    • 2012-11-28
    • 2012-03-27
    • 1970-01-01
    • 2012-09-17
    • 2011-01-15
    相关资源
    最近更新 更多