どう誤検出を抑えるのか、次世代ツールでは何ができるのかある命令を求めたい場合には、フォワードスライされました（CodeSonar の解析コマンドは、通常シングを実行します。のビルドコマンドにフックする形式になります）。

図5 にCodeSurfer によるフォワードスライシン> codesonar hook-html project make -f project.mkfile

グの結果を示します。本稿ではモノクロでわかりづらいですが、黄色でハイライト表示されているワーニングの例

命令（q）に対して、赤色で表示された命令（w）がその影響を受ける可能性のあるすべての命令に出力されたワーニングの一部を図6 に示します。

なります。また、この応用としてデッドコードな

図中のコードは、未初期化変数ワーニングが検出ども識別できます。

されていることを示しています。

次世代の静的解析ツールの採用事例

図6 で示されたコードは、実際のコードの一部になります。関数S̲Key では、いくつかのローカル変数が定義されています。ここで、変数 is̲

ここでは、「CodeSonar」を活用した静的コード解析技術の採用事例を紹介します。

図 5 ◎ CodeSurfer による静的スライシング

医療機器向けソフトウェアの解析に関して、新技術の調査を行っている米国食品医薬品局（FDA；Food and Drug Administration）の研究者が、機器内の潜在的な欠陥を発見するためにCodeSonar を使用しました。
FDA の CDRH（医療機器・放射線保健センタcqー）は、医療機器の市販後調査を管理監督していbwbwます。しかしながら、市販後調査を行うことは容易な仕事ではありません。最新の医療機器ソフト

bw

ウェアの複雑さという条件下では、出荷されたソbw
bw

フトウェアの事前知識がない第三者の立場である
CDRH の調査員が調査を実施することは非常に困

bw

難で、そして時間がかかる作業です。このような場合、ソフトウェア欠陥を追跡する唯一効果的な方法は、従来、手作業でソースコード自体をレビ

図 6 ◎未初期化変数ワーニング

ューする方法でした。これまで、この作業を支援するために、静的な解析技術の用途を調査していました。
今回、レビュー対象の制御ソフトウェアは、主にC/C++で実装されています。そして、そのソフトウ
ェアは、3つの独立したモジュール形式で開発され、約20万行のコードサイズで構成されています。
CodeSonar による解析は、次のコマンドを使用し、3 つのモジュールそれぞれに対して別々に実行
組込みプレス Vol.13 ●109

静的コード解析ツールの限界と進化
button̲pressed、numberとbutton̲pressは、関数ワーニングの精査の最初にデフォルト値で初期化されます。しかし、変数button は、初期化されていません。また、そこれらの出力されたワーニングが、今回のプロれは1267 行目で呼び出される関数ProcessButton

ジェクト（医療機器）において、実際の問題の原で引数として渡され、そこで値を割り当ててられ因となるかどうかを判断するために、手動で精査る可能性もあると推測することもできます。さら作業が行われました。その結果、直接的に装置故に、関数ProcessButton は、条件付きループ内か障の原因ではないと判断された場合には、そのワら呼び出されます。またProcessButtonn 内でも条ーニングのいくつかは、このプロセス間で取り除件付きの命令を含むかもしれません。そして、そかれました。たとえば静的コード解析では、けっ

こでは変数button に対して、有効な値が割り当てして使用されない変数が割り当てられた場合、そられない可能性もあります。そのため、1272 行目

れを「未使用値ワーニング」として出力します。のswitch 命令でbutton が使用された場合、そこがこれらのタイプのワーニングは、一般的にそれだ未初期化変数 ワーニングとして出力されます。

けでは無害であると判断される場合もあります。

これは、switch 命令に従って実行されると、思いしかしツールでは、いくつかのセーフティクリテがけないパス実行を引き起こす可能性があります。

ィカルコーディング規約がそれらの使用を禁止しそして、それは最終的には、装置の故障を引き起ているので、デフォルトでは、そのワーニングをこすかもしれません。

出力する仕様になっています。

このコード解析では、上記のようなワーニング

この精査作業の結果として、最終的に127 個のが全部で736 個出力されました。ワーニングクラ

ワーニングが実際の懸念事項になると判明しまし

スごとに分類された結果を表2 に示します。

た。ここで、このプロセスで取り除かれた残りの表 2 ◎ CodeSonar が検出したワーニング一覧

609個のワーニングは、今回のプロジェクトにおいて、特に重大な欠陥ではないと判別されたというワーニングクラス

検出された
ワーニング数

精査後の問題数

バッファオーバラン6の誤検出でしたが、その多くはプロジェクトの特バッファアンダーラン

9

性上の方針であったり、文脈上から単に重要でなキャストによる値変更

116

無視された戻り値

14

ゼロによる割り算

1

メモリリーク25

リターン命令のミス

13

1

NULLポインタ参照

6228

冗長な条件

139

429

ことになります。そのうちのいくつかはツール側いと判断されたものになります。

成果
この静的解析手法を利用してソフトウェアの検証にかかった全体の労力は、210人時間でした。こ
こには、第三者が解析作業を実施しているというビット幅を超えるシフト

2事情による調整作業の時間も多く含まれます。そ型オーバラン

3

れを考慮しても、このデータは、すべての解析を型アンダーラン

2手作業のみで純粋に行った場合にかかる時間や労未初期化変数169

36

力と比べると、かなり少ないものであると判断さ

未到達コード

34

20

れました。

未使用値

23

無意味な割り当て

118

110● 組込みプレス Vol.13

そして、さらに、静的解析手法は、手作業で行
9うプロセスとは対照的に、ソフトウェア内のエラどう誤検出を抑えるのか、次世代ツールでは何ができるのかーを正確に、そして自動的に追跡する目的におい用方法であるといえます。ては、信頼できる手段を提供しているという結論

また、機能面では解析精度や速度の向上はもとになりました。たとえば、テストケースで実施さより、バグトラッキングやマネージメントシステれていないパスでさえ、精密に、かつ広範囲に解ムなどのエンタープライズ対応が強化されていく析します。そのため、一度すでに多くのテストを傾向にあります。今後の展開としては、次のよう実施されたソフトウェアに対してでさえ、新たにな改良や強化が検討されています。

バグを検出する場合もありました。
さらに、ワーニングにいたるまでのパスや条件、原因までを出力してくれるところも魅力的であると判断されました。これにより、そのワーニングが起きた過程における実行パスを追うことが容易になり、ワーニングが発生する原因のルートを追うことができます。この結果、レビュー時におけ¡バグ検出エンジンのさらなる精度向上¡解析時間の短縮（インクリメンタル解析）¡ユーザカスタムチェック機能の拡張¡バグトラッキングシステムやマネージメントシステムの強化¡問題（バグ）に対する視覚化¡バイナリやマシンコードの解析る時間や労力をかなり大幅に減少することに成功しました。

おわりに市場における静的解析技術のトレンドと今後の展開

本稿では筆者の経験や所感をもとに、静的コー

これまでコーディングルールチェックのようなド解析技術や静的解析ツールに関して解説してき静的解析ツールでは、ファイル間にまたがるようました（一部論理的でない記述もあるかと思いまなメモリリークや、ゼロ割のような実行時に変数すが…）。

やポインタの値が決まるような動的エラーの検出

高精度バグ検出ツールで、ファイルに間にまたは苦手とされてきました。また、メモリリークながる動的エラーを検出し、さらにレビューの際にどを動的テストツールで検出するといった方法もは、プログラムスライス機能などを備えた支援ツありますが、大きなサイズのソフトウェアでは、ールを活用するといった事例が、今後さらに増え解析時間も長くなり、そもそも原理的に、誤検出てくると感じています。ここで説明してきた内容が発生するなどの問題点もありました。

が読者のみなさんの品質向上活動にとって有益な

そこで最近では、今回紹介したような次世代の情報となれば幸いです。 組

静的解析ツールを利用して、動的エラーを検出するという動向が増えてきていると感じています。

●参考文献

また、ツールのバグ検出機能では対応できないよ［1］『Overview of GrammaTech Static Analysis

うな問題に関しては、「CodeSurfer」のような支援Technology』、GrammaTech, Inc.

ツールを活用してレビューを効率的に行い、対策［2］『Static Analysis of Medical Device Softwareするといった傾向も見られます。そして、さらに

using CodeSonar』、Paul Anderson/Gramma

は、コーディングルールチェッカーと高精度バグ

Tech, Inc.

検出ツールなどを併用して、品質を二重、三重に［3］『プログラムスライシング技術と応用』下村隆もチェックしているような現場もあります。これ

夫 著、共立出版 刊、ISBN4-320-02743-4

は、それぞれのツールの特長や原理を活かした運
組込みプレス Vol.13 ●111