形式手法によるC言語検証ツール 1) · 2013-09-12 ·...

Post on 06-Jan-2020

2 views 0 download

Transcript of 形式手法によるC言語検証ツール 1) · 2013-09-12 ·...

形式手法によるC言語検証ツール「VARVEL」

橋本 祐介・徳岡 宏樹・宮崎 義昭

要 旨新しく開発したC言語検証ツールVARVELは、形式手法の一種であるモデル検査と呼ばれる技術を応用し、C言語で書かれたソースコードをモデル化し静的にかつ網羅的に検証し、プログラムに内在するバグ(実行時エラー)の検出を行います。本稿では、VARVELの技術的な背景や機能の概要を紹介します。

キーワード

●静的検証 ●C言語 ●形式手法 ●モデル検査

1. はじめに

組込み領域におけるソフトウェア開発規模の飛躍的な増加に伴い、ソフトウェアの品質をいかに確保するかが大きな課題となっています。この課題の解決に向けて、様々な開発手法やツールが提唱されていますが、そのなかで、形式手法と呼ばれる技術が注目されています。NECは、形式手法の一種であるモデル検査の技術を応用し、C言語で記述されたソースコードに内在するバグ(実行時エラー)を検出するツールであるVARVEL(V 1.0)の開発を行いました。

2. 形式手法とは

形式手法(Formal Methods)とは、論理学・集合論・代数学などを基盤としたシステムの記述手法・検証手法などの総称です。形式手法の一種であるモデル検査は「ソフトウェアやハードウェアなど何らかのシステムの状態遷移モデルをコンピュータに入力することで、その振る舞いにおかしな点がないかどうかを、しらみつぶしにチェックする技術」 1) であり、実行時の不具合を早期に発見する手法として注目されています。当初は、航空宇宙・通信・半導体など高い信頼性や安全性が要求される分野において設計の検証に利用されてきましたが、近年はソースコードの検証への適用も研究が進められています。

NECの研究所においても、LSIの設計検証で実績を上げたモデル検査エンジンをソースコードへ適用する研究を行っており 2) 、VARVELはその成果です( 図1 )。VARVELはC言語のソースコードを解析して、実行時エラーに関係した部分だけ

からなる制御フローを抽出します。そして、この制御フロー上の変数値の変遷を示す巨大な論理式と実行時エラーの発生を示す論理式を立てて、効率のよい充足可能性判定(SAT)アルゴリズムを用いたモデル検査エンジンにより、2つの論理式を同時に満たす変数値、つまりエラーを発生させる変数値を算出します。状態爆発に弱いモデル検査の弱点を補うためにサイズの小さいモデルを構築する点と世界でも高速なモデル検査エンジンとがVARVELの強みです。1変数につき42億通り(2の32乗)の値の組合せで網羅的な探索を行うモデル検査エンジンによって、従来のレビューやテストでは見落とされがちだった不具合を検出することができます。

図1 C言語検証ツール VARVEL

NEC技報 Vol.60 No.2/2007 47

組込みソフトウェア開発環境ソリューション

3. 開発のねらい

NULLポインタの参照や配列の境界違反など、プログラムの実行時に、ある条件でのみ発生するような実行時エラーについては、プログラムを様々なケースで実行させて確認する、いわゆるテストによって検出する方法が一般的に行われています。VARVELは、これまで上記のテスト工程で検出されていた実行時エラーを、より早い工程で、ソースコードの静的検証(プログラム実行を行わない検証)により検出することを可能にします。一般的に、バグの摘出は後工程になるほど発見が難しくまた後戻り工数が大きくなると言われており、早期発見により効率的な品質確保が期待できます。

また、VARVELが対象としているC言語は、言語仕様が簡潔で、かつ性能面でも深いレベルまでチューニングが可能であるなどの理由から、組込みソフトウェアの領域では広範囲に利用されていますが、一方で、ポインタや文字列の扱いなど、実行時エラーを起こしやすい言語要素を含んでいるという問題があります。実行時のパスや変数の取りうる値の組合せは膨大で、人手によるテスト作業だけで実行時エラーを実用的な時間内にすべて摘出することは難しく、しばしば製品に組み込まれたプログラムが出荷後になって問題を起こす事例も少なくありません。VARVELは、これらの見落としがちな実行時エラーを、パスや変数値の網羅的な組合せをモデル化し自動チェックすることで、従来手法では限界のあったバグ摘出を可能にしています。

4. 製品の特徴と位置づけ

現在、ソースコードを静的に検証するツールとして、不具合を起こしやすい記述や、コーディング規約の違反箇所を検出するコードインスペクションツール(以下、CDIツール)が広く利用されていますが、これらのツールとVARVELを比較すると 表1 のような違いがあります。

この表から分かるように、双方のツールは利用する場面や目的が異なりお互いに補完関係にあると言えます。VARVELは既存のツールを置き換えるものではなく、目的に応じて既存ツールと併用することで、効果的にバグ摘出を行うという利用方法を想定しています。

表1 CDIツールとVARVELの比較

5. VARVELの概要

次に、VARVEL(V 1.0)の主な仕様を 表2 に示します。(1)機能構成と動作環境VARVELは、解析対象のCソースコードを入力し検証結果(XML形式)の出力を行うコマンド部分と、コマンドが出力した検証結果を表示し、対話的な確認や分析調査を支援するビューア部分から構成されます。各機能の動作環境はそれぞれLinuxおよびWindowsです。

表2 VARVELの主な仕様

48

組込みソフトウェア開発環境ソリューション 形式手法によるC言語検証ツール「VARVEL」

図2 ビューア(2)検証タイプVARVELは、4種類の実行時エラー(検証タイプと呼びます)を検出することができ、これらはコマンド実行時にオプションとして指定が可能です(表2)。(3)ビューアビューアは、Eclipseのプラグインとして提供されます。VARVELコマンドが出力した検証結果を入力し、エラーが検出された箇所や、エラーに至るまでの処理の流れ(行トレースと各行地点での変数の値)を、ソースコードとマージして表示し対話的に確認することができます( 図2 )。(4)ユーザ定義条件対象のソースコード中で解析の基点となる関数の引数や、ソースコードがない外部関数呼び出しがある場合に、与えられたソースコードからの情報だけでは、引数や返却値の値を解析できないため、VARVELは取り得る値のすべてをモデル化し網羅的な検証を行います。しかしこの場合、必要以上にモデルが大きくなり解析時間が長くなるだけでなく、誤検出(バグではない状態をバグと指摘するなど)が増加する原因となります。そこで、関数の引数や返却値が、ある特定の範囲の値しかとらないことが仕様として分かっている場合には、利用者はこれらの条件を、解析の前提知識としてツールの実行時に指定することができます(これをユーザ定義条件と呼びます)。VARVELは、解析対象のソースコードと同時に指定されたユーザ定義条件を入力し、適正なモデル構築を行います。

6. むすび

今回紹介したVARVELは、NEC社内を対象としたコード検証サービスでの活用を前提に、実際の開発現場への適用を開始しています。コード検証サービスとは、開発されたソフトウェア資産の品質を、専任の担当者がチェックし結果をレポートするもので、すでに複数プロジェクトにおける試行において、通常のテストでは検出できなかった不具合を検出するなど、ツールの有効性を実証する成果をあげています。

今後は、検証精度の向上や解析時間の短縮などの改善を行い、将来的には、組込みソフトウェア統合開発ツールであるSystemDirector Developer's Studio Embeddedへの組込みを予定しています。また上記の改善に加え、Design By Contract(事前/事後条件やassertなど開発者の設計意図を明確に定義することで正しい実装が行われていることを検証する)のサポート機能を追加するなど、ソフトウェアの品質向上を支援する機能強化を実施していきます。*Windowsは、米国Microsoft Corporationの米国およびその他の国における登録商標です。

*Linuxは、Linus Torvalds氏の米国およびその他の国における登録商標または商標です。

*Fedoraは、Red Hat ,Inc.の商標です。*Design by Contractは、Interactive Software Engineeringの登録商標または商標です。

参考文献

1) 日経エレクトロニクス、2005.12.19、pp.87~121.

2) F. Ivancic et al:Model checking C programs using F-Soft. Invitedpaper in the Proceedings of the IEEE International Conference onComputer Design (ICCD), October 2005.

執筆者プロフィール

橋本 祐介ソフトウェアエンジニアリング本部マネージャー

徳岡 宏樹ソフトウェアエンジニアリング本部主任

宮崎 義昭ソフトウェアエンジニアリング本部マネージャー

NEC技報 Vol.60 No.2/2007 49

組込みソフトウェア・ソリューション特集