开源C++扫描库

bgo*_*odr 10 c++ static automation analysis

理由:在我的日常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).

Mat*_* M. 5

我会说CLang指数非常贴合.但是我不认为它将数据存储在数据库中.

无论如何,CLang框架提供了构建满足您需求的工具所需的实际内容,只是因为它的C,C++和Objective-C解析/索引能力.因为它是作为一组可重复使用的库提供的......它是为开发而精心制作的!