iPhone, iPod touchアプリ開発、Tips集の記念すべき第一回として、先日感動した「Build And Analyze」機能についてまとめる。

これを使うと、Xcode上で静的解析を行うことができる。
つまり、ビルド時に、コードをチェックして不整合を指摘してくれる機能なのだ。

解析エンジンはClangだ。これまでは、ターミナルを起動してClangを実行させる必要があったようだが、最新のXcode(Xcode3.2もしくはそれ以上)では、Xcode上で簡単に利用することができるようになった。これを使わない手はない!のだ(ちなみに、Natsuは、ターミナルでClangを実行させたことはない・・・)。

そして、この結果の見え方がまたすごい。矢印で問題点を順に指摘してくれる。まさに、先生のよう。笑
これを使えば、あるレベルまでは、非常に簡単にバグを減らすことができるだろう。


できること
コードレベルで以下のチェックをしてくれる。

・ロジック:未初期化変数の使用や、ヌルポインタの参照等。
・メモリ管理:リークチェック等。
・デッドストア:未使用変数への代入等
・API usage:環境依存のAPI usage

使用方法
いたって簡単。
Xcodeのビルドメニューから、「Build and Analyze」を選択する。これだけ!

Build and Analyze menu

解析例
一番役に立ちそうな、メモリ管理の例をふたつと未初期化変数の例をひとつ挙げてみる。
先に言っておくと、ba_test1とba_test2には、バグが潜んでいる。そして、ba_test3には、今の時点ではバグとは言い切れないかもしれないが、危険なコードが潜んでいる。

注意:下の図はXcodeのスクリーンショットそのままなので、図中の青矢印もXcodeが表示してくれたものです。

&nbsp ba_test1 (Potential leak)


(NSString *)型の変数hogeは、initWithStringにより生成されているため、生成元はオーナーシップを持つ。
また、生成された時点でリファレンスカウンタが+1されている(ということまで事細かに説明してくれている!)。
それにもかかわらず、arrayにaddしたあとで(この時点でリファレンスカウンタはさらに+1されている)releaseしていないため、ここでリークが発生!
Build and Analyze Potential leak

ba_test2 (Incorrect decrement of the reference count)


(NSString *)型の変数hogeは、stringWithStringにより生成されているため、生成元はオーナーシップを持たない。
arrayにaddした時点でリファレンスカウンタが+1され保持しているが、その後、(オーナーシップを持たないにも関わらず)releaseしてしまっている。
これにより、せっかく保持したhogeを不正にreleaseしてしまうこととなり、以降、arrayからhogeを取り出そうとしたときに不正アクセスが発生する可能性がある。
Build and Analyze incorrect release

ba_test3 (Uninitialized value)


引数command_idをもとに、変数valueに値を入れるswitch文。
変数宣言時に初期化されていない、かつ、defaultに落ちたときに代入されないため、未初期化となる可能性がある。
コード生成時には、defaultに落ちることはない!と確信している場合でも、コードの修正を繰り返していくうちに、案外、defaultに落ちる日はやってくるものだ。
アップデートをしてもバグを増やさないために、危険は小さいうちに摘み取ってしまおう。

Build and Analyze uninitialized value

もっと便利な使い方
上では、メニューから解析ツールを起動する方法を説明したが、ビルドするごとに解析することも可能だ。
プロジェクトのビルドオプションで、「静的アナライザを実行」にチェックをしておけばいい。

Build and Analyze Build Option
ただし、プロジェクトの規模が大きいと解析に時間がかかるため、開発効率を低下させかねない。

自分の開発状況と、バグの潜み具合、その他もろもろに応じて、手動と自動を使い分けよう。
なお、ビルドオプションを利用する場合、Debugビルドでのみ有効とし、ReleaseやDistributionでは無効としておくことも、もちろん可能である。
Natsuは、このような使い分けをしている。

参照ドキュメント
Xcode project management guide

関連する本(リファレンスカウンタ方式のメモリ管理)
詳解 Objective-C 2.0

05-02章(p.90)〜05-04章(p.105)

ものすごくわかりやすい!!


 
© 2012 iOS 開発ブログ Natsu's note Suffusion theme by Sayontan Sinha