Facebookは、Javaのコードを静的に解析してマルチスレッドプログラミングで発生するデータ競合のバグを発見するツール「RacerD」をオープンソースでリリースした。

アプリケーションのレスポンスを改善するうえで、マルチスレッド化は重要な選択肢のひとつです。

その一方で、マルチスレッドのアプリケーションは十分に注意深くプログラミングしないと、変数の値が予期しないタイミングでほかのスレッドから書き換えられるなどの問題が紛れ込みやすいものです。

しかもマルチスレッドに起因する問題は再現が難しく、一般に発見するのが困難です。

RacerDリリース：Facebookで1000以上ものバグを発見

Facebookは、こうしたデータ競合の問題を、コードを静的解析することで発見し、警告してくれるツール「RacerD」をオープンソースで公開しました。

Facebookの説明によると、RacerDはロックもしくは@ThreadSafeアノテーションを用いたJavaコードが解析対象。

RacerDはすでに10カ月前からFacebookが開発しているAndroidアプリのコードに対して使われ、1000以上のバグを防いできたとのこと。

RacerD has been running in production for 10 months on our Android codebase and has caught over 1000 multi-threading issues which have been fixed by Facebook developers before the code reaches production. It has helped support the conversion of part of News Feed in Facebook's Android app from a single-threaded to a multi-threaded model. RacerDはこれまで本番環境で10カ月、私たちのAndroidのコードベースに対して使われ、1000以上のマルチスレッドの問題を指摘してくれたおかげで、Facebookのデベロッパーは正式リリース前にそれらを修復できた。これはFacebookのAndroidアプリのニュースフィードの一部分を、シングルスレッドからマルチスレッドへ転換する支援となった。

（「Open-sourcing RacerD: Fast static race detection at scale」から）

正確性とスケーラビリティのバランス

静的コード解析でマルチスレッド動作時のすべての可能性を追っていくと、すぐに可能性が爆発してしまい現実的な解析時間では収まらなくなってしまいます。

そのためRacerDでは次の方針でコードを解析していると説明されています。

1. Don't do whole-program analysis; be compositional. プログラム全体を解析するのではなく、合成的になる 2. Don't explore interleavings; track lock and thread information. 割り込みを探索するのではなく、ロックとスレッド情報を追う 3. Don't attempt a general, precise alias analysis; use an aggressive ownership analysis for anti-aliasing of allocated resources. 全般的で正確なエイリアス（ここでは別名の意味ではなく、データ競合問題のことを指すと推察される）分析をせず、割り当てられたリソースの反エイリアスのための積極的なオーナーシップ分析を行う

こうした方針で正確性とコード分析のスケーラビリティのバランスをとっているとのことです。

コード解析ツール「Infer」

RacerDは、2015年にオープンソースとして公開された静的コード解析ツール「Infer」の一部として公開されましたが、RacerD単独でも起動できます。

FacebookではInfer/RacerDをCI（継続的インテグレーション）の一部としてすでに組み込んでいるそうです。