【发布时间】: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