Analyze简介

Clang Static Analyzer是一款静态代码扫描工具,专门用于针对C,C++和Objective-C的程序进行分析。已经被Xcode集成,可以直接使用Xcode进行静态代码扫描分析,也可以单独在命令行下使用并提供html格式的输出报吿和xml格式的结果文件方便集成到Jenkins上进行展示

Analyze主要的作用有:

  • 内存泄露检查 Memory Error
  • 逻辑错误检查 Logic Error
  • 声明错误检查 Dead Store
  • API调用错误检查 API Misuse

点击Analyze后,Xcode会自动进行编译分析,需要一段时间,之后会像提示警告一样,提示有多少分析的结果。所有的分析结果按照如上的类别,归类显示。点击某个错误的地方,会定位到出错的地方,然后点击向上向下的箭头,会详细展示出出错的步骤。

blog_ analyzer_001

1、API调用错误检查:API Misuse(Apple)

API的错误,一般是在打段的逻辑处理中没有注意OC的使用细节。如:数组不能添加空值,数组的元素不能是空值,字典的value不能是空等等。下面这单代码:str 的初始值为空,经过一段逻辑处理后,还是有可能是空,是不能添加到数组中的。

blog_ analyzer_002

2、逻辑错误检查 Logic Error

初看这段代码,并没有觉得有什么不妥,根据字符串获得index的值。这个前提是字符串一定要按照这个规则提供,如果没有按照这个规则提供,则index就没有值。通过Analyze分析,就检查出来了。

blog_ analyzer_003

3、声明错误检查 Dead Store

很多时候我们创建了一些中间变量需要使用,但是在最终功能的实现上并没有用到这个变量。但是这些变量依然留在代码中,没有删除。这就造成了内存的不必要的开销。这对这部分变量,不需要的时候就要及时的删除。同理:创建类声明的属性,如果没有用到就要及时删除。因为创建类时,会根据类的属性的多少创建对应的内存。

blog_ analyzer_004

4、内存错误 Memory error

开发的过程中,容易给声明非空的对象赋值nil,导致出错。包括:nil 赋值给了一个期望非空值的指针、Null赋值给非空对象,返回了 nil 值,期望返回一个非空值。 blog_ analyzer_005

5、内存泄露 Memory (Core Foundation/Objective-C)

虽然是在ARC模式下,但不是什么东西都可以释放,例如上述的C-types对象,都需要手动来进行释放,所以上面的问题只需手动释放就可以了:CGImageRelease(scaledImage); 其它的如CoreFoundation对象有时候需要CFRelease,malloc/calloc等有时候需要free,还有标准IO fopen之类的需要fclose。

一般来说都是由于使用的CoreFoundation后没有release造成的。在RAC下Foundation框架下的不需要进行release,CoreFoundation框架下仍然需要release。

blog_ analyzer_006