ソフトウエア解析ツールの専門メーカーであるコベリティ(Coverity)は2008年5月12日,マルチスレッドのJavaプログラムを動的に解析するツール「Coverity Thread Analyzer for Java(以下Thread Analyzer)」を日本国内向けに6月から販売開始すると発表した。これに合わせて米国本社のCEOであるSeth Hallem氏(写真)が来日し,日経ソフトウエア誌のインタビューに答えた。
Thread Analyzerは,マルチスレッドのJavaプログラムを動作させながら解析して(動的解析),マルチスレッド・プログラム特有の問題点を検出する。具体的には,複数のスレッドが同時に同じメモリー領域にアクセスしてデータの不整合を引き起こしてしまう現象(競合)や,相手が持つリソースの解放をお互いに待ち続けてアプリケーション全体の処理が止まってしまう「デッドロック」といった現象が発生する可能性がある部分を指摘してくれる。
米Coverityは2007年1月から日本市場に参入し,同年9月に日本支社を開設している。「Coverity Prevent(以下Prevent)」というC/C++とJavaに対応する静的解析ツール(プログラムを実行せずに解析するツール)を主力製品としており,ACCESSやNTTドコモなど組み込み業界に多くの顧客を持っている。Hallem氏はインタビューで,新製品の特徴と今後の計画について語ってくれた。発言の要旨は以下の通り。
他社製品と比べて,Thread Analyzerが優れている点はどこか。
テストにかかる時間がまず挙げられる。他社の同種の製品ではコードの解析に,コード実行の10~100倍の時間がかかる。今回発表したThread Analyzerなら,コード実行の2倍程度の時間でテストが済む。
そして,テストの結果判明した競合やデッドロックだけでなく,将来発生するかもしれない競合やデッドロックを検出するところも大きなポイントだ。これで,考えられるすべての不具合を検出できるようになったと考えている。従来の製品ではテスト実行時に発生した競合やデッドロックしか検出できなかった。
運用段階になって発生した競合やデッドロックの実例を教えてほしい。
2003年に北米8州とカナダの一部で同時に停電が発生した。約5000万人が影響を受けた大停電だ。調査の結果,原因はマルチスレッド・プログラムが引き起こした競合だと判明した。しかし,停電が発生するまでシステムはきちんと動いていた。この場合では,システムの運用開始から300万時間経過してから初めて競合が発生した。このように,マルチスレッド・プログラミングのミスは忘れたころに発生し,甚大な被害をもたらすことがある。
将来発生するかもしれない競合やデッドロックも検出させるために,どのような工夫を施したのか。
競合やデッドロックはタイミングの問題と考えられがちだが,タイミングだけが原因と考えると,将来起こり得る問題を予知できない。そこで,私たちは競合やデッドロックを検出するときに,タイミングには頼らず,どのスレッドが関係しているのかを調べるようにした。例えば,メモリー領域の排他制御をしていないとき,二つのスレッドが同じ領域に同時にアクセスすると,競合が起こる。ここまではタイミングの問題だ。しかし,私たちはタイミングの問題だけとは考えず,どのスレッドがアクセスしているのかということや,次にその領域にアクセスするスレッドはどれかといったことまで調べる。こうすると,状況が変わったときに起こり得る競合も検知できる。
そして,私たちだけが持っている強みとして,静的分析と動的分析のそれぞれに対応した製品を提供しており,両方の製品が相乗効果を生み出す点も挙げられる。Preventで静的分析をすれば,Thread Analyzerによる動的分析の時間が短くなり,Thread Analyzerで動的分析を実行すると,静的分析に必要な手順を大幅に省略できる。そして,プログラムをより完全なものに近づけることができる。
Preventは静的解析ツールとのことだが,Javaの世界には「CheckStyle」,「FindBugs」,「PMD」といった無償で使える静的解析ツールが存在する。これらのツールとPreventとはどのように違うのか。
まず,CheckStyleやPMDは単純にコードのスタイル,つまり一定の決まった書き方に沿っているかどうかを確認するツールである。スタイルに合わせて書くことで,問題を少なくするという考え方だ。これらのツールは静的解析ツールの中でも第一世代と言える。第二世代に当たるのがFindBugsだ。このツールはJavaのバイトコードを解析し,エラーを引き起こす可能性がある部分を指摘する。範囲は狭いものの,関連する複数のメソッドやクラスにまたがった解析も可能だ。
そして弊社のPreventは第三世代と言えるものだ。無数のクラスで構成された巨大なプログラムを対象に,複数のメソッドやクラスにまたがる解析が可能だ。jarファイルも解析の対象にできる。そして,既存のツールよりも誤検知率が低くなっている。現時点ではPreventの誤検知率は15%以下だ。
コベリティの顧客には組み込み関連の企業が多いように見えるが,Thread AnalyzerはJava版から発売している。C/C++版を先に発売しなかったのはなぜか。
マルチスレッド・プログラミングの需要を考えた。パソコン,サーバー向けプロセサでは,マルチコアによる並列処理で処理能力を上げるようになってきている。その結果,Javaプログラマがマルチスレッド・プログラミングに本格的に取り組むようになってきたと考えて,Java版を先に開発することにした。 とはいえ,組み込みの世界にもマルチスレッド・プログラミングの波が押し寄せてきている。Java版を発売した後はC/C++版を発売する予定だ。 家庭用ゲーム機にはすでにマルチコア・プロセサが入っている。データセンター用の巨大なルーターなどもマルチコア・プロセサを搭載するようになってきた。次は携帯電話だと考えている。Thread AnalyzerのC/C++版はこのような業界でも役に立つと確信している。 C/C++版では,組み込み業界への導入を狙っているので,x86だけでなくさまざまなプロセサをターゲットにした分析ができるようにする。そして,次は.NET Frameworkの世界に進出する。Thread AnalyzerとPreventのC#版を計画している。