相変わらずNDAは解除されない.NDAを続けるメリットがいまいちよくわからない.たとえば,今みたいにSDKに入っているコードから商品の開発計画とかがばれるからだろうか.うーむ.
※ここからはSDK一般のお話ですから.あしからず.
Xcodeに付属のInstrumentsのleaks挙動が怪しい.リークを検出したり,しなかったりする.
そこで,@takuma104にclangを勧められた.
clangのMacOSX向けのツールはXcodeのプロジェクトのファイルを全部舐めて解析してくれるらしく,使いやすそうと考えたので,試してみたので報告する.
・本家サイト
 http://clang.llvm.org/index.html
・説明サイト
 http://kirika.la.coocan.jp/acts/cocoastudy/200807/clang-static-analyzer.html
・インストール(MacOSX10.5.4で試した)
ここからビルドされたパッケージをダウンロード.ダウンロードしたファイルを解凍し,中のフォルダとファイルをすべて/usr/local/binにコピーする.(/usr/loca/bin/にパスが通っていることを前提)
・使ってみた
コマンドでXcodeのプロジェクトファイルのパスに移動.その位置でツールを使う.

cd 
scan-build xcodebuild

とやると,コンパイルが始まり,コードが解析される.
解析結果は,htmlで書き出され,-oで出力先のパスを設定できる.デフォルトは/tmp.
・結果出力
実際に2tchの解析結果の画像.


clang_result01.png

を!なんかmemory leakの警告が出てる.早速調べてみる.コードを見せるのはグレー?ブラック?らしいのでリークしたところの処理の概要をソースコードで見せると,

+ (Hoge*) hoge {
Hoge *obj = [[Hoge alloc] init];
// initialize
if( result )
return obj;
else
return nil;
}

まぁ,クラスメソッドのインスタンス生成にはautoreleaseを投げとけとか,賛否両論あるでしょうが・・・・.バグがあるよと言われてみると,明確.nilを返すときにobjにretainが残った状態でメソッドが終了してしまうという簡単なメモリリークのバグです.
これをclangは,4つのパスに分解して,発見してくれました.

[1] Method returns an object with a +1 retain count (owning reference).
[2] Taking false branch
[3] Taking false branch.
[4] Object allocated on line 141 and stored into 'obj' is no longer referen
ced after this point and has a retain count of +1 (object leaked).

なるほど.使える.他にも色々機能があるようです.
そろそろ,llvm勉強しなければ・・・・.