关于Clang是什么,你可以先看一下如下所示的iOS开发的完整编译流程图。
Clang 为一些需要分析代码语法、语义信息的工具提供了基础设施。这些基础设施就是 LibClang、Clang Plugin 和 LibTooling。
小结
在今天这篇文章中,我和你说了 Clang 做了什么,以及提供了什么能力。从中可以看出,Clang 提供的能力都是基于Clang AST 接口的。
这个接口的功能非常强大,除了能够获取符号在源码中的位置,还可以获取方法的调用关系,类型定义和源码里的所有内容。
以这个接口为基础,再利用 LibClang、 Clang Plugin 和 LibTooling 这些封装好的工具,就足够我们去开发出满足静态代码分析需求的工具了。比如,我们可以使用 Clang Plugin 自动在构建阶段检查是否满足代码规范,不满足则直接无法构建成功。再比如,我们可以使用 LibTooling 自动完成代码的重构,与手动重构相比会更加高效、精确。
还记得我们在上一篇文章“Clang、Infer 和 OCLint ,我们应该使用谁来做静态分析?”中,提到的Clang 静态分析器的引擎吗?它使用的就是Clang AST 接口,对于节点 Stmt、Decl、Type 及其派生节点 Clang AST 都有对应的接口,特别是 RecursiveASTVisitor 接口可以完整遍历整个 AST。通过对 AST 的完整遍历以及节点数据获取,就能够对数据流进行分析,比如Iterative Data Flow Analysis、path-sensitive、path-insensitive、flow-sensitive等。
此外,还能够模拟内存分配进行分析,Clang 静态分析器里对应的模块是 MemRegion,其中内存模型是基于 “A Memory Model for Static Analysis of C Programs”这篇论文而来。在Clang里的具体实现代码,你可以查看 MemRegion.h 和 RegionStore.cpp 这两个文件。对于 Clang 静态分析器的原理描述,你可以参看官方说明。
手中握有好兵器,你对App 代码质量的掌控也就有了底气。程序员开发软件的目的,就是要提高开发效率,同时也不要忽略检查代码质量时的效率。所以,对于开发者来说,我们要避免人工繁琐的 Review 代码,并减少由人工带来的低效和高差错率。我们的原则就是,能够让程序自动解决的,绝对不要人工手动完成。