我正在扩展一个软件工具来计算软件项目的指标。
然后使用这些指标进行静态代码分析。
我的任务是为 c 和 c++ 项目实现指标的计算。
在开发过程中,我遇到了一些问题,导致重置并使用不同的工具或编程语言重新开始。
我将按时间顺序尽可能好地说明我试图解决的过程、问题和事情。
一些指标:
由于 c++ 是一种难以解析的语言,我自己编写 c++ 解析器超出了规模,我倾向于使用现有的 c++ 解析器。
因此,我开始使用 LLVM 项目 中的库来收集有关源文件的句法和语义信息。
LLVM 工具链接:https://clang.llvm.org/docs/Tooling.html
首先 我从用 C++ 编写的 LibTooling 开始,因为它答应我“完全控制”抽象语法树 (AST)。
我尝试了 RecursiveASTVistor 和 Matchfinder 方法但没有成功。
因此 LibTooling 被驳回,因为我无法在 AST 中检索有关节点周围的上下文信息。
当访问 AST 中的特定节点时,我只能对回调使用react。但我不知道我目前处于什么环境中。
例如。当我访问 C++RecordDeclaration(类、结构、 union )时,我不知道它是否是嵌套记录。
但是需要这些信息来计算单个类的代码行。
第二种 方法是通过 Python 绑定(bind)使用 LibClang 接口(interface)。
使用 LibClang 接口(interface),我能够以递归方式逐个节点遍历 AST 节点,并将所需的上下文信息存储在堆栈上。
在这里,我遇到了 LibClang 的一个普遍问题:
这导致 第三次 和当前尝试使用由 Antlr 生成的 c++ 解析器提供了一个 c++14 grammar 。
在解析器之前不执行任何预处理器。
这很好,因为解析了完整的源代码并且忽略了预处理器指令。
不好的是解析器似乎没有那么难。它在可以编译的代码上失败,导致 AST 损坏。所以这个解决方案也是不够的。
我的问题是:
所以源代码是原封不动的,AST 是完整和详细的。
如果您认为这不是提出此类问题的正确地方,请随时将我重定向到另一个地方。
最佳答案
回答你最后一个问题,
另一种方法是解析源代码,就好像它只是文本一样。这避免了预处理源的需要,并避免引入复杂的解析器。有关示例/介绍,请参阅本文:Andrian Marcus、Denys Poshyvanyk 的“类的概念内聚”。您仍然可以通过这种方法收集诸如 LOC 和方法数量之类的信息,而无需完整的解析器。
这种方法有缺点(就像任何方法一样):
关于c++ - 如何处理c和c++源代码来计算静态代码分析的指标?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55281049/