如何处理C和C 源代码以计算静态代码分析的指标
How to process c and c++ source code to calculate metrics for static code analysis?
iam扩展了软件工具来计算软件项目的指标。然后将指标用于进行静态代码分析。我的任务是实施C和C 项目的指标计算。
在开发过程中,我遇到的问题导致重置并以不同的工具或编程语言重新开始。我将陈述我试图按时间顺序和尽可能好的解决方案解决的过程,问题和事物。
一些指标:
- 代码的行用于类,结构,工会,功能/方法和源代码
- 方法计数用于类和结构
- 复杂性用于类,结构和功能/方法
- 依赖项 for class和structs and structs
由于C 是一种很难解析的语言,并且我自己编写C 解析器的尺寸不大,所以我倾向于使用现有的C 解析器。因此,我开始使用 llvm Project 的库来收集有关源文件的句法和语义信息。
llvm工具链接:https://clang.llvm.org/docs/tooling.html
首先我从用C 写的libtool开始,因为它向我保证了我通过抽象语法树(AST)"完全控制"。我尝试了递归eastvistor,而Matchfinder的方法则没有成功。
因此,由于我无法检索有关AST中节点周围的上下文信息,因此被解雇了。当访问AST中的特定节点时,我只能在回调上做出反应。但是我不知道目前是什么情况。例如。当我访问C 唱片唱片(类,结构,联合)时,我不知道它是否是嵌套的记录。但是需要这些信息来计算单个类的代码行。
第二方法是通过python绑定使用libclang接口。借助Libclang接口,我能够通过节点递归遍历AST节点,并在堆栈上存储所需的上下文信息。在这里,我遇到了libclang的一般问题:
在为文件创建AST之前,启动预处理器并解决所有预处理器指令。就像他应该做的那样。
- 这很好,因为如果预处理器无法解析所有包含指令,则输出AST将不完整。
- 这很糟糕,因为我无法为任何C 项目提供所有包含文件或目录。
- 这很糟糕,因为如果定义了是否定义了有条件的预处理器指令包围的代码,则不是AST的一部分。用不同的定义或未定义预处理器变量多次解析相同的文件。
这导致第三和使用ANTLR生成的C 解析器的当前尝试提供了C 14语法。
在解析器之前没有执行预处理器。这是很好的,因为整个源代码已被解析,并且预处理指令被忽略。坏事是解析器似乎并不那么艰难。它在可以编译的代码上失败,导致AST损坏。因此,该解决方案还不够。
我的问题是:
- 在用libclang解析C/C 源或标头文件之前,是否可以选择停用预处理器?因此,源代码未触及,AST已完成和详细。
- 是否有一种方法可以解析C/C 源代码文件,而无需提供所有必要的包括目录,但仍会导致详细的AST?
- 因为IAM用尽了选项。在分析/解析C/C 源代码时,其他哪些方法值得一看?
如果您认为这不是问此类问题的正确地方,请随时将我重定向到另一个地方。
回答您的最后一个问题,
由于IAM用尽了选项。其他方法可能值得查看分析/解析C/C 源代码时?
另一种方法是解析源代码,就好像仅是文本一样。这避免了需要预处理源并引入复杂的解析器的必要性。有关示例/简介,请参见本文:"类的概念凝聚力"。由安德里安·马库斯(Andrian Marcus),丹尼斯·波西瓦尼克(Denys Poshyvanyk)。您仍然可以从此方法中收集LOC和方法数量,而无需完整的解析器。
这种方法具有缺点(以及任何方法):
- 它要么1)解析注释以及源代码,要么2)要求您从源中删除注释。但是后者是一个简单的一步。可能还可以的原因是,即使注释包含有关代码的信息,这可能有助于确定哪些模块更紧密地耦合,等等。
- 它将将本地变量,方法名称,参数名称等汇总到"单词袋"中。您正在与之合作。
- Android Studio 中带有静态库的原生C++代码
- 以下代码执行哪种内存分配(动态或静态)?
- 如何以静态代码分析友好的方式使用 #define 防护?
- 静态代码检查器抱怨.虚惊一场?
- 如何在 C++11 中解释静态代码
- 使用"静态"如何影响我的代码速度?
- 如何解决C++中声纳库贝静态代码分析错误"Explicitly define the missing copy constructor, move constructor .."
- 如何启用使用另一个类的静态方法的模板函数的自动推导,从而消除冗长的调用方代码
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 在静态初始化期间运行代码
- 生成代码(在编译时)以调用模板的每个实例化的静态函数
- C++代码中奇怪的未使用的静态字符串声明
- 我可以在将项目编译为静态库(未定义的引用)时在代码中使用 QImage 吗?
- C++静态库的代码混淆
- Cppcheck 静态代码分析器实际上可以检测到不太常见的警告(如 "Relative Path Traversal (CWE-23)" 或"Buffer Under-read(CWE-127)")吗
- 如果要测试,我是否应该将C 代码写为静态或动态库
- Android NDK-天然C 代码的静态分析
- 我怎么知道C++编译器是否制作线程安全的静态对象代码
- 设备代码中的CUDA类静态成员的成语
- 仅在满足静态constexpr时才包含代码