如何处理C和C 源代码以计算静态代码分析的指标

How to process c and c++ source code to calculate metrics for static code analysis?

本文关键字:代码 静态 计算 源代码 何处理 处理      更新时间:2023-10-16

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)要求您从源中删除注释。但是后者是一个简单的一步。可能还可以的原因是,即使注释包含有关代码的信息,这可能有助于确定哪些模块更紧密地耦合,等等。
  • 它将将本地变量,方法名称,参数名称等汇总到"单词袋"中。您正在与之合作。