Facebook、マルチスレッドのコードを静的解析してデータ競合を検出する「RacerD」、オープンソースで公開。同社Androidアプリのリリース前に1000以上の問題を検出

2017年10月23日

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


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

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

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

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

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

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(継続的インテグレーション)の一部としてすでに組み込んでいるそうです。

あわせて読みたい

ソフトウェアテスト・品質 プログラミング言語 Facebook




タグクラウド

クラウド
AWS / Azure / Google Cloud
クラウドネイティブ / サーバレス
クラウドのシェア / クラウドの障害

コンテナ型仮想化

プログラミング言語
JavaScript / Java / .NET
WebAssembly / Web標準
開発ツール / テスト・品質

アジャイル開発 / スクラム / DevOps

データベース / 機械学習・AI
RDB / NoSQL

ネットワーク / セキュリティ
HTTP / QUIC

OS / Windows / Linux / 仮想化
サーバ / ストレージ / ハードウェア

ITエンジニアの給与・年収 / 働き方

殿堂入り / おもしろ / 編集後記

全てのタグを見る

Blogger in Chief

photo of jniino

Junichi Niino(jniino)
IT系の雑誌編集者、オンラインメディア発行人を経て独立。2009年にPublickeyを開始しました。
詳しいプロフィール

Publickeyの新着情報をチェックしませんか?
Twitterで : @Publickey
Facebookで : Publickeyのページ
RSSリーダーで : Feed

最新記事10本