程序静态分析(Program Static Analysis)是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。目前静态分析技术向模拟执行的技术发展以能够发现更多传统意义上动态测试才能发现的缺陷,例如符号执行、抽象解释、值依赖分析等等并采用数学约束求解工具进行路径约减或者可达性分析以减少误报增加效率。
静态分析可以帮助在编写代码时及时发现代码错误,从而保证工程质量。下面看看常用的几种工具:
-
Analyze
Xcode 自带的静态分析工具
Analyze
,通过静态语法分析能够找出在代码层面就能发现的内存泄露问题,还可以通过上下文分析出是否存在变量无用等问题。但是,Analyze
的功能还是有限,还是无法帮助我们在编写代码的阶段发现更多的问题。所以,这才诞生出了功能更全、定制化高、效率高的第三方静态检查工具。比如,OCLint、Infer、Clang 静态分析器
等。这些都是基于Clang 库
开发的。
-
OCLint
OCLint
是基于 Clang Tooling
开发的静态分析工具,主要用来发现编译器检查不到的那些潜在的关键技术问题。
- 可以用
Homebrew
安装,但是现在只能更新到20.11
,使用起来有问题:Command PhaseScriptExecution failed with a nonzero exit code,解决办法就是用源码运行安装,更新到最新版本:
而且分析整个项目时经常配合xcpretty
使用,而xcpretty
已经不更新了:
-
Clang 静态分析器
Clang 静态分析器(Clang Static Analyzer)
是一个用 C++
开发的,用来分析 C、C++ 和 Objective-C
的开源工具,是 Clang
项目的一部分,构建在 Clang
和 LLVM
之上。
但似乎不更新了:
-
Infer(大神们比较推荐)
Infer
是 Facebook 开源的、使用 OCaml
语言编写的静态分析工具,可以对 C、Java 和 Objective-C
代码进行静态分析,可以检查出空指针访问、资源泄露以及内存泄露。
Infer
工作的流程:第一个阶段是转化阶段,将源代码转成Infer
内部的中间语言。类C
语言使用Clang
进行编译,Java
语言使用javac
进行编译,编译的同时转成中间语言,输出到infer-out
目录。第二个阶段是分析阶段,分析infer-out
目录下的文件。分析每个方法,如果出现错误的话会继续分析下一个方法,不会被中断,但是会记录下出错的位置,最后将所有出错的地方进行汇总输出。默认情况下,每次运行 infer 命令都会删除之前的infer-out
文件夹。你可以通过--incremental
参数使用增量模式。增量模式下,运行infer
命令不会删除infer-out
文件夹,但是会利用这个文件夹进行diff
,减少分析量。综合来看,
Infer
在准确性、性能效率、规则、扩展性、易用性整体度上的把握是做得最好的。
-
SwiftLint
SwiftLint
是 realm 公司开发的一个插件,专门用于管理 Swift
代码的规范。
SwiftLint
的工作原理是检查Swift
代码编译过程中的AST 和 SourceKit
环节,从而可以摆脱不同版本Swift
语法变化的影响。AST
是编译前端形成的抽象语法书(Abstract Symbolic Tree
),SourceKit
过程用来对AST
进行代码优化,减少内存开销,提高执行效率。
SwiftLint
使用起来就简单很多:
脚本命令:
//方便复制
if which swiftlint >/dev/null; thenswiftlintelseecho "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"fi