gpt4 book ai didi

c++ - 如何处理 c 和 c++ 源代码以计算静态代码分析的指标?

转载 作者:行者123 更新时间:2023-12-03 06:52:25 25 4
gpt4 key购买 nike

我正在扩展一个软件工具来计算软件项目的指标。
然后使用这些指标进行静态代码分析。
我的任务是实现 c 和 c++ 项目的指标计算。

在开发过程中,我遇到了导致重置并使用不同的工具或编程语言重新开始的问题。
我将按时间顺序并尽可能好地说明我试图解决的过程、问题和事情。

一些指标:

  • 代码行 用于类、结构、 union 、函数/方法和源文件
  • 方法计数 用于类和结构
  • 复杂性 用于类、结构和函数/方法
  • 依赖 用于/在类和结构之间

  • 由于 c++ 是一种难以解析的语言,并且我自己编写一个 c++ 解析器超出了规模,我倾向于使用现有的 c++ 解析器。
    因此我开始使用 中的库。 LLVM 项目 收集有关源文件的句法和语义信息。

    LLVM 工具链接: https://clang.llvm.org/docs/Tooling.html

    第一我从用 c++ 编写的 LibTooling 开始,因为它向我 promise “完全控制”抽象语法树 (AST)。
    我试过 RecursiveASTVistorMatchfinder接近没有成功。

    所以 LibTooling 被解雇了,因为我无法在 AST 中检索有关节点周围的上下文信息。
    当访问 AST 中的特定节点时,我只能对回调使用react。但我不知道我目前所处的环境。
    例如。当我访问 C++RecordDeclaration(类、结构、 union )时,我不知道它是否是嵌套记录。
    但是需要这些信息来计算单个类的代码行数。

    第二方法是通过 Python 绑定(bind)使用 LibClang 接口(interface)。
    使用 LibClang 接口(interface),我能够以递归方式逐个节点遍历 AST 节点,并将所需的上下文信息存储在堆栈中。
    在这里,我遇到了 LibClang 的一般问题:

    Before creating the AST for a file the preprocessor is started and resolves all preprocessor directives. Just as he is supposed to do.


  • 这很好,因为如果预处理器无法解析所有包含指令,则输出 AST 将不完整。
  • 这非常糟糕,因为我无法为任何 c++ 项目提供所有包含文件或目录。
  • 这很糟糕,因为无论是否定义了预处理器变量,被条件预处理器指令包围的代码都不是 AST 的一部分。使用已定义或未定义的预处理器变量的不同设置多次解析同一个文件超出范围。


  • 这导致 第三和当前使用 Antlr 生成的 c++ 解析器的尝试提供了 c++14 grammar .

    在解析器之前不执行预处理器。
    这很好,因为解析了完整的源代码并且忽略了预处理器指令。
    坏事是解析器似乎没有那么难。它在可以编译导致 AST 损坏的代码上失败。所以这个解决方案也是不够的。

    我的问题是:
  • 在使用 libClang 解析 c/c++ 源文件或头文件之前,是否有停用预处理器的选项?
    所以源代码原封不动,AST 完整而详细。
  • 有没有办法在不提供所有必要的包含目录的情况下解析 c/c++ 源代码文件,但仍会产生详细的 AST?
  • 由于我没有选择。在分析/解析 c/c++ 源代码时,还有哪些其他方法值得研究?


  • 如果您认为这里不适合提出此类问题,请随时将我重定向到另一个地方。

    最佳答案

    要回答你的最后一个问题,

    Since iam running out of options. What other approaches may be worthlooking at when it comes to analysing/parsing c/c++ source code?


    另一种方法是解析源代码,就好像它只是文本一样。这避免了对源进行预处理并引入复杂的解析器的需要。有关示例/介绍,请参见本文:Andrian Marcus、Denys Poshyvanyk 的“类的概念凝聚力”。您仍然可以通过这种方法收集诸如 LOC 和方法数量之类的信息,而无需完整的解析器。
    这种方法有缺点(与任何方法一样):
  • 它要么 1) 将注释与源代码一起解析,要么 2) 要求您从源代码中删除注释。但后者是一个简单的步骤。可能没问题的原因是,即使是注释也包含有关代码的信息,这可能有助于确定哪些模块耦合更紧密,等等。
  • 它会将局部变量、方法名称、参数名称等都集中到您正在使用的“词袋”中。
  • 关于c++ - 如何处理 c 和 c++ 源代码以计算静态代码分析的指标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55281049/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com