代码优化之Analyze检测

iOS开发中静态检测-Analyze

Posted by Ted on October 9, 2018

一、Clang Static Analyzer简介

https://clang-analyzer.llvm.org/

Clang Static Analyzer是一个源码分析工具用于在C, C++和Objective-C项目中查找bugs。现在它可以在单独的工具 或者 Xcode中使用,如果是单独使用,通过过命令行,与代码构建一起。

Analyzer是100%开源的,是Clang项目的一部分。 与Clang的其余部分一样,Analyzer实现为一个C ++库,可以被其他工具或者应用使用。

静态分析

术语“静态分析”有多种意思的,但在这里我们使用它来表示一些用于分析源代码以便自动发现bugs的算法和技术的集合。类似于编译器警告(这对于查找编码错误很有用),但更进一步,一般使用运行时调试技术(如测试)发现错误。

静态分析错误查找工具在过去几十年中已经从基本的句法检查器发展到那些通过推理代码语义来发现深层错误的工具。 Clang Static Analyzer的目标是提供工业级静态分析框架,用于分析C,C ++和Objective-C程序,这些程序是免费提供的,可扩展的,并且具有高质量的实现。

顾名思义,Clang Static Analyzer建立在Clang和LLVM之上。严格地说,Analyzer是Clang的一部分,因为Clang包含一组可重用的C ++库,用于构建强大的源代码级工具。 Clang Static Analyzer使用的静态分析引擎是一个Clang库,可以在不同的上下文和不同的客户端中重用。

需要考虑的情况

虽然我们认为Clang Static Analyzer对于发现bug已经非常有用,但使用它时要记住几点。

1、持续改进中 Analyzer是一项持续不断的工作。有许多计划的增强功能可以提高其分析算法的精度和范围,以及它将发现的各种错误。

2、比编译慢 在操作上,使用静态分析自动查找深度程序错误是关于交换CPU时间以加强代码。由于使用最先进的静态分析工具进行深入分析,静态分析可能比编译慢得多。

虽然Clang Static Analyzer的设计尽可能快,重量轻,但不要指望它与编译程序一样快(即使启用了优化)。发现bug所需的一些算法在最坏的情况下可能需要指数时间。

Clang Static Analyzer在合理的时间内运行,既可以限制它将要执行的检查工作量,也可以使用聪明的算法来减少查找错误所必须做的工作量。

3、误报 静态分析并不完美。它可能错误地标记代码行为正确的程序中的错误。由于某些代码检查需要比其他检查更高的分析精度,因此误报的频率在不同检查之间可能会有很大差异。

4、更多检查 静态分析并不神奇,Analyzer只能找到一些指定的bug。如果您希望Clang Static Analyzer找到特定类型的错误,请随时提交功能请求或提供您自己的补丁。

二、实际例子

1、Dead Store

img

值被赋予后未被使用。分为两种

img

Value stored to ‘result’ during its initialization is never read

这里的result变量报蓝是因为result变量在下面被重新申请了内存,这里初始化的内存从来没有被使用过,造成内存泄漏

修改

NSMutableDictionary* result;

Value stored to ‘result’ is never read

result变量在之后的代码中从未被访问,造成内存泄漏

修改:将代码注释或者删除即可。

2、Coding Conventions(Apple)

img

这是苹果的一些编码规范,照着提示进行修改即可,比如这里的在接受NSError**变量为参数的方法中应该返回一个non-void的值来表明这个error是否发生。

3、Core Foundation/Objective-C

Core Foundation/Objective-C的一些编码规范,比如在一些生命周期的方法中要调用父类的方法,会有一些操作

img

4、Memory error

Null passed to a callee that requires a non-null 1st parameter

这种是传值的时候传了一个空值

img

nil returned from a method that is expected to return a non-null value

这种是返回的值返回了一个空值,一般在数据源返回的时候如果返回空值会报这个蓝

img

5、Memory(Core Foundation/Objective-C)

代码逻辑导致的潜在的内存泄漏,因为现在是ARC,所以Core Foundation内存泄漏的可能性比较大

img

6、Logic Error

img

逻辑不严谨或者错误造成的问题