シンボリック実行を利用したソフトウェアの互換性確認にかんする考察と実験

標準

先日、ソフトウェア・シンポジウム2015というイベントに参加してきました。イベントでは様々なワーキング・グループが、それぞれソフトウェアに関連するテーマで議論をしました。私は「電脳テスト道具の活用」というテーマのグループに参加し、とっても刺激をうけて帰ってきました。その議論の中で、私が考察した内容についてご紹介しました。ここにその内容をまとめます。

はじめに

いまや人間社会は、ソフトウェアなしでは成り立たない状態です。インターネットは当然ながら、電気エネルギーや鉄道などの社会インフラから身の回りの家電製品まで、ソフトウェアは至る所に存在します。今後、車の自動運転、IoT(Internet of Things)や人工知能の応用が進めば、この流れはますます加速するでしょう。

さて、人間社会は変化します。諸行無常です。それゆえ、ソフトウェアが動作している環境(文脈)も変化します。環境の変化に対応するため、ソフトウェアは継続的に更新する必要があります。余談ですが、ソフトウェアはハードウェアと違って物理的な経年劣化がないですけども、ハードあってのソフトウェアなのでハードウェアの変更(64bit環境への移植とか)でソフトウェアのメンテナンスが必要になるってところは忘れがちです。
古いソフトウェアになればなるほど、変更の必要性は高まります。

下記の図は、IPAさんのデータから抜粋させていただきました。日本におけるソフトウェア開発の実態を示したものです。
2000年以降、新規のソフトウエア開発は減少傾向にあり、逆に派生開発(既存ソフトウェアの変更)の割合は増加傾向にあります。2013年では64%が派生開発でした。

trend

派生開発によくある課題ってなんでしょうか。ここでは3つを挙げてみます。

  1. 短い開発期間
    変更に必要な手間は過小に見積もられがち。
  2. 開発情報の不足
    変更前のドキュメントがない、担当者がいない。
  3. 変更前のソフトウェアとの互換性の確保
    互換性があるべきところが確かにある、ことをどうやって確認する?

いろいろ悩みはつきませんが、ここでは3つめの課題をとりあげて、解決の道筋を考察してみたいと思います。具体的には、互換性を確認するテストについてその課題を特定し、シンボリック実行(Symbolic Execution)という技術を応用した解決方法を検討します。

シンボリック実行とは、一言でいうと、ソフトウェア(プログラム)に存在する実行可能なパス(可達パスといいます)を通すような、入力データを自動的に生成する技術です。こちらのブログ記事がわかりやすいです。

なお、対象とする互換性は、ソフトウェアの論理的動作とします。性能など、そのほかの互換性は対象外です。また、変更の範囲は、ユーザーインターフェース(外部インターフェース)に影響のない範囲とします。これは、テストケースを再利用するための条件です。