【问题标题】:Open-source C++ scanning library开源C++扫描库
【发布时间】:2011-06-20 20:18:02
【问题描述】:

基本原理:在我的日常 C++ 代码开发中,我经常需要 回答基本问题,例如在非常大的 C++ 代码中谁调用了什么 经常变化的基础。但是,我也需要一些 自动化的方式来准确识别代码在做什么 特定的代码区域。 Cscope 等“grep”工具很有用(并且 我已经大量使用它们),但不支持 C++ 语言:它们 不要给出任何方法来识别词汇的类型和种类 给定使用类型或函数的环境 有利于自动化(即使所述自动化仅限于 “只读”操作,例如代码浏览和导航,但我 要求远不止以下)。

问题:是否已经存在基于 C/C++ 的开源库 (本机、非托管、非 Microsoft 或 Linux 特定),可以 静态扫描或分析一大棵 C++ 代码树,并可以生成 回答详细问题的结果集,例如:

  • 某些提供的函数调用了哪些函数?
  • 什么函数使用这个提供的类型?
  • 如果涉及 C++ 类或类模板,则同上上述问题。

结果集应该提供某种“句柄”。我应该可以 将该句柄反馈给库以执行以下类型 内省:

  • 在进行引用的文件中的字节偏移量是多少?
  • 抽象语法树 (AST) 的引用是什么? 参考,以便我可以检查周围的代码结构?和 每个 AST 实体还具有文件路径、字节偏移量和 与之关联的类型信息数据,以便我可以递归地行走 绘制调用者或推荐者的图表以执行有用的操作。

答案应满足以下要求:

  • API:公开的 API 必须是以下之一:
    • C 或 C++,可能是“C 句柄”或基于 C++ 类实例的 (如果是,则必须是通用 C o C++ 代码,而不是 Microsoft 或 特定于 Linux 的代码结构,除非它是为了满足 给定的平台),或
    • 基于命令行标准输入和标准输出。
  • C++ 意识:不限于 C 代码,而是懂 C++ 语言 详细构造,包括对班级间的认识 继承关系和 C++ 模板。
  • 快速:扫描大型代码库的速度应该明显快于 从头开始编译整个代码库。这可能需要 放松,但前提是增量结果检索弹性 到小的代码更改要求完全满足以下。
  • 提供结果计数:我应该可以问“多少个结果 你会提供一些请求吗(不,不要把所有的都发给我 结果)?”的响应时间少于 3 秒,而 必须检索任何给定问题的所有结果。如果需要 得到答案的时间太长,然后浪费开发时间。这是 再加上下一个要求。
  • 增量结果检索:然后我应该可以问“给我 只是这个请求的下 N 个结果”,然后是一个句柄 结果集,以便我可以反复问问题,因此 逐步逐步提取结果。这意味着我 不必等待整个结果集才能看到 所有结果的某个子集。我可以取消 如果我看到足够的结果,就可以安全操作。原因:我需要 回答问题:“构建或开发的影响是什么? 更改某些特定的函数签名?”
  • 适应小的代码更改:如果我更改标题或源 文件,我不应该等待整个代码库 重新扫描,但只有那个头文件或源文件 重新扫描。重新扫描应该很快。例如,不要做 cscope 需要你做的,就是重新扫描整个代码库 小的变化。据了解,如果你改变一个表头,那么 扫描可能需要更长的时间,因为包含该标题的其他文件 必须重新扫描。
  • IDE 不可知:文本编辑器是否不可知(不要让我使用特定的 文本编辑器;我已经做出了选择,谢谢!)
  • 平台无关:与平台无关(不要让我只使用它 在 Linux 上或仅在 Windows 上,因为我必须同时使用这两个 我日常工作中的平台,但我需要该工具在 因为我在两个平台上都有代码沙箱)。
  • 非二进制:除了下载时间之外不应该花费我任何东西 并编译库及其所有依赖项。
  • 不是试用版
  • 积极支持:可能会将帮助请求发送到邮件列表 或相关论坛可能会在不到 2 分钟内得到回复 天。
  • 网络无关:库构建的数据库应该能够直接在其上使用 来自 32 位和 64 位系统(Linux 和 Windows)的网络 同时可互换,并且不嵌入硬编码路径 到文件系统,否则这些文件系统会将数据库“root”到 特定网络。
  • 与构建环境无关:不需要深入了解我的构建环境,具有 可能需要编译器知识的显着例外 提供的 CPP 宏定义(例如 -Dmacro=value)。

【问题讨论】:

  • 这个问题看起来像是你会购买符合你规格的东西......但不,你想要它是免费的 :) 或者你所说的“开源”实际上是什么意思?
  • 我不认为静态分析是你真正想要的。静态分析是关于检查程序不变量并报告程序中的潜在错误。你想要的是索引。
  • @matthieu-m:你是绝对正确的。我已经删除了标题中的“静态分析”。

标签: c++ static automation analysis


【解决方案1】:

我会说CLang Index 非常适合。但是我不认为它将数据存储在数据库中。

无论如何,CLang 框架提供了您实际需要的东西来构建一个根据您的需求量身定制的工具,这仅仅是因为它的 C、C++ 和 Objective-C 解析/索引功能。而且由于它是作为一组可重用的库提供的……它是为开发而设计的!

【讨论】:

  • 这看起来和我要找的很接近。然而,需要进行实验来了解 libindex 对于索引大规模 C++ 代码库的鲁棒性。
【解决方案2】:

我不得不承认我没有使用过任何一个,因为我使用了很多使用 Microsoft 编译器扩展的 Microsoft 特定代码,我不希望他们理解,但是我知道这两个开源分析器是Mozilla PorkClang Analyzer

【讨论】:

  • 尽管 Mozilla Pork 看起来很有希望作为查找和修复有问题的代码区域的示例,但我认为 Clang Analyzer(以及它可能构建的 libindex 库)更有希望。
  • 不幸的是,我不能说任何一种方式。但是,在我看来,Clang Analyzer 更易于使用。
【解决方案3】:

如果您正在寻找代码分析的结果(指标、图表等),为什么不使用工具(而不是 API)来做呢?如果可以的话,我建议你看看Understand

它不是免费的(有试用版),但我发现它非常有用。

【讨论】:

  • 我过去曾尝试将我的大量 C++ 代码提供给理解,但他们的解析器挂在我身上。由于它是二进制的,我无法弄清楚它为什么挂起,所以我放弃了它。哦,不符合非试用版的要求。
【解决方案4】:

也许带有 GraphViz 的 Doxygen 可能是您的一些限制但不是全部的答案,例如 Doxygen 的分析不是增量的。

【讨论】:

  • Doxygen 也挂断了我的源代码,所以它不是一个选项。此外,它生成的 HTML 文件需要浏览器才能使用,而我正在寻找的是一个 API,我可以使用它来驱动符号查找和其他操作。
  • Doxygen 还生成 xml 文件,您可以在其中找到所需的所有内容。
猜你喜欢
  • 2012-03-13
  • 1970-01-01
  • 2011-03-13
  • 2016-03-28
  • 1970-01-01
  • 2011-07-17
  • 2018-03-25
  • 2011-06-28
  • 1970-01-01
相关资源
最近更新 更多