LLVM 项目博客

LLVM 项目新闻和来自战壕的详细信息

静态分析工具:在 CppDepend 中使用 Clang


静态分析是一种计算机程序调试方法,通过检查代码而不执行程序来完成。该过程提供了对代码结构的理解,可以帮助确保代码符合行业标准,并可以发现难以检测的错误。

为了开发一个 C / C++ 静态分析工具,需要一个解析器来解析源代码。C++ 是一种非常强大的语言,但其语法有点复杂,这使得解析器不容易开发。

大约四年前,当我们开始开发 CppDepend 时,我们需要一个可靠的 C / C++ 解析器。当时,Clang 是一个选择,但它并没有得到广泛使用,我们不知道它最终是否会发展成为一个功能齐全的编译器前端。

去年,为了 CppDepend 3.0 的主要版本发布,我们重新评估了我们的 C / C++ 解析器,目标是获得更可靠的结果。我们检查了 Clang,看看它的发展方向,并惊讶地发现它现在几乎实现了所有 C++11 特性,并且变得非常流行。Clang 现在提供了坚实的基础设施来编写需要程序语法和语义信息的工具。



Clang 被设计为模块化的,就像其他编译器一样,它有三个阶段:
  • 前端解析源代码,检查错误,并构建一个语言特定的抽象语法树 (AST) 来表示输入代码。
  • 优化器:它的目标是对前端生成的 AST 进行一些优化。
  • 后端:生成最终代码以供机器执行,它取决于目标架构。



在我们的案例中,我们只需要使用前端解析器,并且我们使用生成的 AST。为此,我们添加了我们自定义的 ASTFrontEndAction。
每个 ASTFrontEndAction 都创建了一个或多个 ASTConsumer,如以下依赖关系图所示



ASTConsumer 是一个抽象类,我们必须为我们的特定需求实现我们的 AST 消费者。为此,我们必须查看现有 AST 消费者的实现,以了解它们的工作原理,以下列出所有继承自 ASTConsumer 的类


我们以 ASTPrinter 和 ASTDumpXML 为例,了解如何实现我们特定的 AST 消费者。

感谢 LLVM 和 Clang 背后的所有开发者为提供强大的编译器所做出的巨大努力,以及感谢所有开源 C / C++ 贡献者,我们免费为您提供 CppDepend "专业版许可证"。CppDepend 可用于分析代码库,以:

提高代码库质量。
帮助新贡献者了解现有代码库。
自动化代码审查,以确保满足经理指定的编码规则。
生成自定义报告以用于文档目的。

要获取您的 CppDepend 专业版许可证,您只需向 [email protected] 发送邮件,并提供以下信息:

贡献者的姓名。
您贡献的补丁的链接。

谢谢!