问题:是否存在基于开源C/C++的库@H_301_2@(本机,不管理,不是Microsoft或Linux特定)可以@H_301_2@静态扫描或分析大树的C代码,并可以生成@H_301_2@结果集回答详细的问题,如:
>某些提供的函数调用什么函数?@H_301_2@>什么功能使用这种提供的类型?@H_301_2@>如果涉及到C类或类模板,则同上述问题.
结果集应该提供某种“句柄”.我应该能够@H_301_2@将该句柄提供给库以执行以下类型@H_301_2@内省:
>进行引用的文件中的字节偏移量是多少?@H_301_2@>抽象语法树(AST)的引用是什么?@H_301_2@引用,以便我可以检查周围的代码结构?和@H_301_2@每个AST实体也将具有文件路径,字节偏移量和@H_301_2@与它相关联的类型信息数据,以便我可以递归地走@H_301_2@调用者或引荐来源的图表进行有用的操作.
答案应符合以下要求:
> API:暴露的API必须是以下之一:
> C或C并且可能是“C句柄”或基于C类实例的@H_301_2@(如果是,则必须是通用的C代码,而不是Microsoft-或@H_301_2@Linux特定的代码构造除非是要满足特定的@H_301_2@给定的平台),或@H_301_2@>命令行标准输入和基于标准输出.
> C知道:不限于C代码,而是懂C语言@H_301_2@以细节的细节构建,包括对班级的意识@H_301_2@继承关系和C模板.@H_301_2@>快速:应该扫描大的代码库明显快于@H_301_2@从头开始编译整个代码库.这可能需要@H_301_2@放松,但只有增量结果检索和弹性@H_301_2@对小代码的变更要求完全满足下面.@H_301_2@>提供结果计数:我应该可以问“有多少结果@H_301_2@你会提供一些请求(而不是不给我所有的@H_301_2@结果)?“的响应时间小于3秒@H_301_2@必须检索任何给定问题的所有结果.如果需要@H_301_2@太长时间才能得到答案,那么浪费开发时间.这是@H_301_2@再加上下一个要求.@H_301_2@>增量结果检索:我应该可以问“给我”@H_301_2@只是下一个N个结果的这个请求“,然后一个句柄@H_301_2@结果集,所以我可以反复问这个问题@H_301_2@逐步逐步拉出结果.这意味着我@H_301_2@不必在看到之前等待整个结果集@H_301_2@所有结果的一些子集.而且我可以取消@H_301_2@如果我看到足够的结果,安全运行.原因:我需要@H_301_2@回答一个问题:“构建或发展的影响是什么?@H_301_2@改变一些特定的功能签名?@H_301_2@>弹性到小代码更改:如果我更改标题或源@H_301_2@文件,我不必等待整个代码库@H_301_2@重新扫描,但只有那个头或源文件@H_301_2@重新扫描.重新扫描应该很快.例如,不要做什么cscope@H_301_2@需要你做,这是重新扫描整个代码库@H_301_2@小变化.据了解,如果您更改标题,那么@H_301_2@扫描可能需要更长时间,因为包含该标题的其他文件@H_301_2@必须重新扫描.@H_301_2@> IDE Agnostic:文本编辑器不可知(不要让我使用具体的@H_301_2@文本编辑器;我已经做出了我的选择,谢谢!)@H_301_2@平台不可知论:与平台无关(不要让我只使用它@H_301_2@在Linux上或仅在Windows上,因为我必须使用这两者@H_301_2@平台在我的日常磨练,但我需要的工具是有用的@H_301_2@因为我在两个平台上都有代码沙箱).@H_301_2@>非二进制:除了时间以外,不应该花费我任何东西来下载@H_301_2@并编译库及其所有依赖项.@H_301_2@>不是试用品.@H_301_2@>积极支持:可能向邮件列表发送帮助请求@H_301_2@或相关论坛可能会在不到2的情况下得到回应@H_301_2@天.@H_301_2@>网络不可知:数据库的库构建应该可以直接使用@H_301_2@来自32位和64位系统(Linux和Windows)的网络@H_301_2@可互换地,同时,并不嵌入硬编码的路径@H_301_2@到文件系统,否则会将数据库“root”到a@H_301_2@特定网络.@H_301_2@>构建环境不可知:不需要亲密了解我的构建环境@H_301_2@可能需要编译器知识的显着例外@H_301_2@提供CPP宏定义(例如-Dmacro = value).
解决方法
无论如何,如果只是因为C,C和Objective-C解析/索引能力,CLang框架提供了实际需要构建适合您需求的工具.而且由于它是作为一组可重复使用的图书馆提供的…它是为开发而制作的!