07 | Clang、Infer 和 OCLint ,我们应该使用谁来做静态分析?
戴铭
该思维导图由 AI 生成,仅供参考
你好,我是戴铭。
随着业务开发迭代速度越来越快,完全依赖人工保证工程质量也变得越来越不牢靠。所以,静态分析,这种可以帮助我们在编写代码的阶段就能及时发现代码错误,从而在根儿上保证工程质量的技术,就成为了 iOS 开发者最常用到的一种代码调试技术。
Xcode 自带的静态分析工具 Analyze,通过静态语法分析能够找出在代码层面就能发现的内存泄露问题,还可以通过上下文分析出是否存在变量无用等问题。但是,Analyze 的功能还是有限,还是无法帮助我们在编写代码的阶段发现更多的问题。所以,这才诞生出了功能更全、定制化高、效率高的第三方静态检查工具。比如,OCLint、Infer、Clang 静态分析器等。
一款优秀的静态分析器,能够帮助我们更加全面的发现人工测试中的盲点,提高检查问题的效率,寻找潜在的可用性问题,比如空指针访问、资源和内存泄露等等。
同时,静态分析器还可以检查代码规范和代码可维护性的问题,根据一些指标就能够找出哪些代码需要优化和重构。这里有三个常用的复杂度指标,可以帮助我们度量是否需要优化和重构代码。
圈复杂度高。圈复杂度,指的是遍历一个模块时的复杂度,这个复杂度是由分支语句比如 if、case、while、for,还有运算符比如 &&、||,以及决策点,共同确定的。一般来说,圈复杂度在以 4 以内是低复杂度,5 到 7 是中复杂度,8 到 10 是高复杂度,11 以上时复杂度就非常高了,这时需要考虑重构,不然就会因为测试用例的数量过高而难以维护。
而这个圈复杂度的值,是很难通过人工分析出来的。而静态分析器就可以根据圈复杂度规则,来监控圈复杂度,及时发现代码是否过于复杂,发现问题后及早解决,以免造成代码过于复杂难以维护。
NPath 复杂度高。NPath 度量是指一个方法所有可能执行的路径数量。一般高于 200 就需要考虑降低复杂度了。
NCSS 度量高。NCSS 度量是指不包含注释的源码行数,方法和类过大会导致代码维护时阅读困难,大的 NCSS 值表示方法或类做的事情太多,应该拆分或重构。一般方法行数不过百,类的行数不过千。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
iOS开发中的静态分析工具是开发者在编写代码阶段及时发现代码错误、提高工程质量的重要利器。本文详细介绍了静态分析器的作用和常用的复杂度指标,如圈复杂度、NPath复杂度和NCSS度量,以及静态分析器的优缺点。文章还介绍了三款主流的静态分析工具OCLint、Clang静态分析器、Infer,并详细介绍了它们的特点和安装方式。OCLint基于Clang Tooling开发,包含了71条规则,覆盖了语法上的基础规则、Cocoa库相关规则、约定俗成的规则等,具有灵活的规则配置和可扩展性。Clang静态分析器是一个用C++开发的开源工具,专门为速度做过优化,提供了丰富的功能接口,使得开发者可以编写自定义的checker来进行静态检查。另外,文章还介绍了Facebook开源的静态分析工具Infer,它可以对C、Java和Objective-C代码进行静态分析,检查出空指针访问、资源泄露以及内存泄露。总的来说,本文全面介绍了iOS开发中的静态分析工具及其特点,为开发者提供了丰富的选择和安装指南,对于提高代码质量和开发效率具有重要的参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《iOS 开发高手课》,新⼈⾸单¥59
《iOS 开发高手课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(41)
- 最新
- 精选
- iLearn老师,Swift的要怎么搞?
作者回复: SwiftLint
2019-03-26420 - scorpiozj请问Xcode中的静态检查就是clang 静态检查吗?
作者回复: 是的
2019-03-292 - jimmyoclint的一些研究 https://xiaozhuanlan.com/topic/9647358012
作者回复: 赞
2019-03-272 - 頑 張infer跑不起来的 希望这篇能帮到https://blog.csdn.net/elisa1988/article/details/46531745?utm_source=blogxgwz7
作者回复: 赞
2019-04-0121 - 择一城终老从来没有用过,感觉听天书一样,哈哈!不过大致了解了其功能,但是原理还真不好懂
作者回复: 可以用用,动手试试看
2019-03-27 - 晓龙clang是一个c c++ oc 编译器,静态分析利用clang做代码编译层面的事情,内存泄露,强弱引用,方法调用深度等分析工作交给分析器本身。 Clang是不是类似于oc中的runtime?
作者回复: 当然不是
2019-03-26 - Roger给宝宝喂夜奶,顺便来看看新的一课讲什么2019-03-26132
- drunkenMouse1. OClint 想执行自己指定的项目,还是不会。。最后查了别的资料,说是要写脚本安装xcpretty,而且说是不维护了。 2. CLang 静态分析器的clang —analyze -Xclang -analyzer-checker-help 我执行之后,并没有成功显示常用的Checker。。 3. Clang 静态分析器的lib/StaticAnalyzer/Checkers这个路径也没有找到,是不是换地方了? 4. OClint、Clang静态分析器与Infer 都需要Clang编译器的LLVM对源码做词法、语法上的分析生成AST(一种静态语法树,代码更精简,遍历更轻松),然后对生成的AST做静态分析,达到编译代码层面的分析。 5. OCLint说是不维护了,所以除了规则太多导致的重点找不到,可定制性过高导致的易用性变差外,也PASS(其实我对这句规则多所以XX的理解感受不是很深。。) Clang静态分析器,规则少只能检策较大问题,对内存泄漏一类问题若无错误也不提示外,回调次数也多。每执行一句,都要回调所有的Checker的回调函数。所以PASS Infer 定制性不是最高,但是不差。可以小范围分析,所以效率高。还支持增量分析(使用已缓存数据,非增量会清楚缓存)。所以,建议Infer2019-03-2720
- yb坏蛋biubiuclang作为llvm编译器前端,进行预编译、词法分析生成token片、语法分析生成AST后,提供一个切面,开发者可以在这里利用clang生成的AST语法树进行自定义规则遍历分析,clang也提供了相应的checker和抛出诊断异常的diagnosis。2019-03-269
- 简生个人觉得虽然OCLint检测规则多,易用性没有Infer好。但是Sonar+OCLint可以对检测结果进行一个可视化的管理,还是会偏向于选择OCLint。😊2019-03-3026
收起评论