mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-24 20:00:37 +00:00
144 lines
6.4 KiB
Markdown
144 lines
6.4 KiB
Markdown
# 质量检测
|
||
|
||
## 静态检测
|
||
### 概念
|
||
|
||
静态分析器是一个 Xcode 内置的工具,使用它可以在不运行源代码的状态下进行静态的代码分析,并且找出其中的 Bug,为 app 提供质量保证。
|
||
|
||
静态分析器工作的时候并不会动态地执行你的代码,它只是进行静态分析,因此它甚至会去分析代码中没有被常规的测试用例覆盖到的代码执行路径。
|
||
|
||
静态分析器只支持 C/C++/Objective-C 语言,因为静态分析器隶属于 Clang 体系中。不过即便如此,它对于 Objective-C 和 Swift 混编的工程也可以很好地支持。
|
||
|
||
其中包括了安全、逻辑、以及 API 方面的问题。分析器可以帮你找到以上的这些问题,并且解释原因以及指出代码的执行路径。
|
||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/XcodeStaticAnalyzerCheckPoint.png" style="zoom:30%" />
|
||
|
||
|
||
|
||
### 原理
|
||
|
||
- 通过语法树进行代码静态分析,找出非语法性错误
|
||
- 模拟代码执行路径,分析出 control-flow graph(CFG)
|
||
- 预置了常用的 checker
|
||
|
||
一个大型项目代码行数非常多,所有跑完全部的 CFG 必定很耗时。
|
||
|
||
|
||
|
||
### 如何使用
|
||
|
||
Xcode 静态分析功能是在程序未运行的情况下,对代码的上下文语义、语法、和内存情况进行分析,可以检测出代码潜在的文本本地化问题(Localizability Issue)、逻辑问题(Logic error)、内存问题(Memery error)、数据问题(Dead store)和语法问题(Core Foundation/Objective-C)等。
|
||
功能入口在: `菜单栏 -> Product -> Analyze`。可以使用快捷键:Command+Shift+B
|
||
|
||
#### 文本国际化
|
||
|
||
Xcode Target -> Build Settings -> Static Analysis - Issues - Apple APIs -> Miss Localizablity 设置为 YES。可以帮助检测发现,缺少国际化的文本。
|
||
|
||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/XcodeStaticAnalyzerLocalizationIssue.png" style="zoom:30%" />
|
||
提示说明 `User-facing text should use localized string macro` 缺少本地化的 API,正确的采用下面一行的写法。
|
||
|
||
#### 逻辑问题
|
||
|
||
分母不能为0.
|
||
|
||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/XcodeStaticAnalysisLogicIssue.png" style="zoom:30%" />
|
||
|
||
#### 内存问题
|
||
|
||
虽然 Xcode 默认使用 ARC 管理内存,但是某些 C API 还需要开发者自己进行内存管理。比如 CF 框架下的 API。
|
||
以及 block nil 判断等。
|
||
|
||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/XcodeStaticAnalysisMemoryIssue.png" style="zoom:30%" />
|
||
|
||
|
||
|
||
#### 数据问题
|
||
|
||
在编码过程中,一些数据问题可以通过Analyze很好的提示出来。比如下图:
|
||
|
||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/XcodeStaticAnalysisDataIssue.png" style="zoom:30%" />
|
||
|
||
|
||
|
||
#### Xcode 13 新增的检查项
|
||
|
||
在 Xcode 13 中,静态分析器也得以升级,现在它可以捕获更多的一些逻辑问题:
|
||
|
||
1. 断言 Assert 的副作用
|
||
2. 死循环
|
||
3. 无用的冗余代码(例如多余的分支条件)
|
||
4. C++ 中 move 和 forward 的滥用导致的潜在问题
|
||
|
||
一部分的改进来自于开源作者们对 Apple Clang 编译器的贡献。
|
||
|
||
|
||
|
||
##### NSAssert 中的副作用
|
||
|
||
使用 NSAssert 规避非预期的代码逻辑是很常见的好习惯,但是不规范地使用也会带来一些副作用,例如在 NSAssert 的判断条件中对变量或内存进行修改操作。
|
||
|
||
本来 `self.count` 默认为0,经过 `mockAssertIssue` 方法中,赋值为1,然后写了 NSAssert 是为了增加健壮性,但这个断言有副作用,虽然判断了赋值后是1,再自增判断等于2,但这不符合预期。经过断言已经修改为2了。
|
||
|
||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/XcodeStaticAnalysisNSAssertSideEffectIssue.png" style="zoom:30%" />
|
||
|
||
|
||
|
||
##### 死循环
|
||
|
||
下面是一个很常见的死循环的案例,这种稍微复杂一些的逻辑,乍眼一看,似乎没有什么问题:
|
||
|
||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/XcodeStaticAnalysisEndelessLoopIssue.png" style="zoom:30%" />
|
||
|
||
这段代码中,是一个二层循环,但是在内层的循环中,没有对 j 做递增,而是做了 result 的递增,这个问题虽然会隐晦,但是新版本的静态检查器会检测出来。
|
||
|
||
|
||
|
||
Analyze 功能强大,其实际能检测出的问题会更多。
|
||
|
||
|
||
|
||
### 自定义分析器参数
|
||
|
||
Xcode 也为静态分析器提供了很多的自定义项,方便开发者根据自身工作流进行定制。在 BuildSetting 中通过搜索 `Static Analysis` 关键字,可以筛选出跟分析器相关的设置项。
|
||
|
||
|
||
|
||
### 每一次编译都执行静态分析
|
||
|
||
通过打开 `Analyze During 'Build'` 可以使得每一次编译操作都执行分析器:
|
||
|
||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/XcodeStaticAnalyzerEachBuild.png" style="zoom:30%" />
|
||
|
||
### 设置静态分析器的运行模式
|
||
|
||
`Mode of Analysis for 'Analyze'` 可以配置分析器运行的模式,Xcode 提供了两种运行模式:
|
||
|
||
- `Shallow(faster)` :`Shallow`规避了去检查一些耗时复杂的检查操作,所以 Shallow 运行的更快
|
||
- `Deep` 则进行深入的检查,能抛出更全面的错误
|
||
|
||
同一个工程,分别看看 Shallow 和 Deep 的耗时差别:
|
||
|
||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/XcodeStaticAnalyzerDeepAndShallowBuildDuration.png" style="zoom:30%" />
|
||
|
||
|
||
|
||
### 专项检查配置
|
||
|
||
静态分析器也提供了一些专项检查的配置,可以根据工程情况定制选择。假设,项目有严格的安全检查,可以打开下图中选中的这些配置项目:
|
||
|
||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/XcodeStaticAnalyzerSecuritySetting.png" style="zoom:30%" />
|
||
|
||
|
||
|
||
再或者,如果静态分析器抛出的一些问题不想关注,可以在 Xcode Build Settings 中关闭掉。从而更聚焦于感兴趣、更关注的问题。
|
||
|
||
|
||
|
||
### 单个文件的分析
|
||
|
||
也可以针对单个文件做静态检查。操作路径为:Product -> Perform Action -> Analyze "FileName"。
|
||
|
||
这样只会对单个文件检测,且不会分析 import 进来的文件(可以看到右边的 Person.m 的问题没有被检测出来)
|
||
|
||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/XcodeStaticAnalysisForSingleFile.png" style="zoom:30%" />
|
||
|