小编Tar*_*exx的帖子

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

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

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

一些指标:

  • 类、结构、联合、函数/方法和源文件的代码行
  • 类和结构的方法计数
  • 类、结构和函数/方法的复杂性
  • 类和结构之间的依赖关系

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

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


首先,我从用 C++ 编写的 LibTooling 开始,因为它答应我“完全控制”抽象语法树 (AST)。我尝试了RecursiveASTVistorMatchfinder方法,但没有成功。

因此 LibTooling 被驳回,因为我无法在 AST 中检索有关节点周围的上下文信息。当访问 AST 中的特定节点时,我只能对回调做出反应。但我不知道我目前处于什么环境中。例如。当我访问 C++RecordDeclaration(类、结构、联合)时,我不知道它是否是嵌套记录。但是需要这些信息来计算单个类的代码行。


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

在为文件创建 AST 之前,预处理器已启动并解析所有预处理器指令。正如他应该做的那样。

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

这导致了第三次也是当前尝试使用由Antlr生成的 c++ 解析器提供的 …

c++ parsing metrics llvm-clang antlr4

5
推荐指数
1
解决办法
564
查看次数

RxJS 如何创建或模拟异步?

我在理解 RxJS 可观察对象和主题的执行模型/顺序时遇到问题。我读了很多关于 RxJS observables 的文献和博客文章,这是更好的承诺,因为它们的订阅可以取消,并且它们可以通过next()发出多个结果/值。

这个问题可能很容易回答,但是 RxJS 如何创建或模拟异步呢?RxJS Observables 是否包装 Promise 并创建一系列 Promise 以使代码执行异步?或者是因为实现的可观察模式,更改被异步传播到订阅者,但代码执行仍然是同步的?

在我看来,当 JavaScript 代码通过事件循环处理的任何 JavaScript 回调队列中的回调进行处理时,它是异步的。

javascript asynchronous rxjs

4
推荐指数
1
解决办法
501
查看次数

标签 统计

antlr4 ×1

asynchronous ×1

c++ ×1

javascript ×1

llvm-clang ×1

metrics ×1

parsing ×1

rxjs ×1