C/C++コンパイラをテストして妥当性を検証する
コンパイラ品質の重要性:アプリケーション開発やシステムインテグレーションに欠かすことのできないコンパイラは、非常に複雑なソフトウエアであり、たったひとつのエラーであっても、コードの開発段階、あるいは市場投入後に、甚大な問題を引き起こす原因になりかねません。それゆえコンパイラの確かな品質は極めて重要であることは明らかです。間違ったコードが生成されることでこうむる損害は、コンパイラの品質管理への投資と比較になりません。また、ISO 26262 等の機能安全規格では、ソフトウエアツールチェインの適正なレベルの信頼が要求されます。コンパイラが正しいことの証明には、C/C++言語標準規格への適合性、正確性、堅牢性を厳密にテストすることが必要です。
ユーザーがコンパイラをテストすべき理由とは?
高いレベルのコンパイラ品質
Solid Sands 社の SuperTestは、コンパイラ品質への信頼を得るためのコンパイラテストと検証のためのテストスイートです。業界最大クラスのコンフォーマンステストとともにテストファイルが提供され、コンパイラの開発者のみならず、コンパイラを使用する組織やその品質管理部門が、機能安全規格の要件(コンパイラの不具合が製品システムに影響しないことを確認する)を満たすことや、コンパイラによって間違ったコードが生成されることを未然に防ぐことを目的に活用しています。
これにはコンパイラによる解析、変換、最適化を評価する多くのテストも含まれます。また、このテスト群や特別な機能は、継続的に追加されています。フレームワークには、コンフォーマンステストと診断テストの両方が組み込まれています。診断テストは、不正なプログラムに対するコンパイラエラーを検証します。またフレームワークには、テストスイートのサブセットを選択する機能があり、以前にフェイルしたテストを再実行するなどの柔軟性を備えています。POSIXベースのユーザインターフェイスは直感的であり、あらゆるコンパイラ開発環境とシームレスに統合できるので、新しいテストの追加やクロスプラットフォームでの検証サポートをも容易に行えます。

■SuperTest の機能
一般的なコンパイラのテスト・検証スイートに求められるC言語標準規格の準拠や正確性と品質チェック等はもちろんのこと、さらにSuperTestは次のような機能も持っています。
C++、C++11、C++14、C++17のテスト
リモート、及びパラレルテスト
HTML形式の明解なレポート
テストの追加が容易にできる
パワフルで柔軟性に富むテストジェネレータ
…

■Calling Convention Tester

関数の呼び出し規約はターゲットアーキテクチャに依存しますが、その実装はコンパイラに固有です。例えば、引数の評価順序は言語仕様で定義されていません。また通常、速度を向上させるよう最適化されており、やはり複雑であるコンパイラのレジスタ割り当てと高度に結びついています。
Calling Convention Testerは、コールする側とされる側それぞれを含む一対のファイルを自動生成して、呼び出し規約やバイナリーインターフェイスのエラーを明確にします。そして、単一コンパイラのApplication Binary Interfaceのコンプライアンスだけでなく、同じコンパイラの異なるバージョン間や、同じターゲット用の異なるコンパイラ間でも検証することができます。
顧客の声「呼び出し規約に準拠することで、他のサプライヤーの製品と繋がることで問題が発生しても、お相手の問題として切り分けすることができている。各社がSuperTestを使ってくれると、もっと助かるのだが、、」
コンパイラが呼出し規約に正しく準拠していることを前提にしていませんか?もし「自社で使用」あるいは、「お相手が使用」するコンパイラに問題がある場合、その把握や対策にたいへんな工数を割くことになります。
予め知ることができれば、事前に対策を打ち、不用意な問題を避けることができるでしょう。
■Depth suites
C言語の標準規格では、データモデルは実装依存となっています。それゆえテストスイートは、演算処理の前提を一定の範囲内に収める必要があります。SuperTestのDepth-suitesは、特定のデータモデル用に生成されて、演算処理の境界について詳細な情報が得られます。Depth-suitesは、5つのオペランドまでの徹底した演算処理のテストを行います。既に30もの異なるDepth-suitesがSuperTestに組込まれていますが、要求に応じてカスタマイズしたものをご提供することもできます。
顧客の声「アーキテクチャ固有のデータ長(例えばchar もint も24ビット)に合わせて演算精度のテストができる。」
■Tempest (TEMPlate Expander for SuperTest)
ランダムなテストのバリエーションを作るための、ユニークで柔軟性に富んだ、プロダクションルール駆動型のテストジェネレータです。ジェネレータースクリプトベースのプロダクションルールのセマンチックによって、振舞いが予測可能な複雑なプログラムを生成することができます。コンパイラの特定の問題に対して、そのテスト範囲を全面的なテストを生成することで拡張して、それ以上の問題が存在しないことを掘り下げて調査することができます。
■SuperTest Library Suite
C/C++標準ライブラリのテスト 「標準ライブラリ関数をテストする 」、「C/C++の実行時ライブラリ -「隠れたライブラリ」をお忘れなく」、「ライブラリコードはセーフティクリティカルアプリケーションの一部分」の3つの記事をまとめて公開しました。
C/C++言語のプログラムを構成する要素には文字列処理や数学関数のようにプログラム実行時に必要となるソフトウェア部品があります。アプリケーションプログラムが安全であるためには、コンパイラが生成するオブジェクトコードの部分だけでなく、これらも検証することが必要です。実行時に必要となるこのようなソフトウェア部品は実行時ライブラリと呼ばれますが、その中で言語規格で定義されているものを標準ライブラリと呼び、プログラム開始時に必要となるスタートアップルーチンや例外処理ルーチンなどを実行時ライブラリとして区別することもあります。この記事では、標準ライブラリと実行時ライブラリに関するSuperTestでの検証について紹介しています。
関連する技術資料として、「セーフティクリティカルなアプリケーションでのSuperTestによるC標準ライブラリの認定」、「C、C++コンパイラのツール認定の効用」
もご参照ください。
顧客の声「コンパイラをバージョンアップする時にSuperTestでチェックして、使ってはいけない最適化などの社内ルールを施行することで、過去のバージョンに戻さなければならないような問題が起こらなくなった。」
顧客の声「C99 コンパイラなのにC89のライブラリが混同されていて、sin, cosなどの数学関数で問題になるところを、事前に回避できた。」
顧客の声「自動運転などで画像認識等はC++のライブラリに依存することになるので、SuperTestのライブラリテスト機能にも注目している。Float16、AUTOSAR C++14 など」
「Vermeer」リリース
SuperTestは最新版「Vermeer」をリリースしました。
SuperTest「Vermeer」リリースには最適化コンパイラの包括的なテスト、「ベアメタル」システムのサポート、C++ 17サポート、トレーサビリティの強化、およびマルチプロセッサWindows環境でSuperTestを実行する機能が含まれています。
SuperTestはコンパイラがC/C++言語標準規格を満たすことをテストする中で、結果的に多くの最適化のテストをカバーしていましたが、新たに追加された最適化テストスイートで、どのようなコンパイラに対しても最大のカバレッジを達成できるようになりました。
関連記事
「16ビット浮動小数点数のテスト 」
ADASの技術に16ビットFPフォーマットを採用することで、開発や車両のコストが下がり、その普及が加速されます。しかし安全性が第一です。
「関数呼び出しのテスト 」
呼び出し規約は速度を向上させるよう最適化されており、やはり複雑であるコンパイラのレジスタ割り当てと高度に結びついています。
「最適化の正しさを検証する 」
先進のコンパイラ最適化が安定していて十分テストされているものだと考えることは間違っています。
「GNU-C++の -Os が壊れた日 」
例外処理や継承に関するもののいくつかが、新しいフリースタンディングの設定では突然フェイルしました。
コンパイラが効率的なソースコードを効率的なマシンコードにコンパイルすることで、アプリケーション開発において重要な役割を果たすことは周知のことですが、その役割には大きな責任があります。私たちの経験では、x86やARMなどの主要なプロセッサーアーキテクチャー用に広く使用されるCおよびC++コンパイラーは、一般的に信頼性があります(完全ではありませんが...)。しかし、DSPやアプリケーション固有の8ビットマイクロコントローラなどのアプリケーション指向プロセッサ用のコンパイラはどうでしょうか?
アプリケーション指向プロセッサは、汎用的で規模の大きなものよりも、はるかにコスト効率が良く、便利でオンチップI/O機能が適切にパッケージ化されています。アプリケーション開発者は、これらのデバイス用のコンパイラが主要なデバイスと同様に信頼できることを願っていますが、残念ながらこれは必ずしもそうではないことがわかりました。
弊社(Solid Sands社)は最近、そのようなコンパイラのクオリフィケーション(適格性の評価)をお請けしました。これはよく知られているベンダーの商用コンパイラでしたが、SuperTestのような包括的なテストスイートに初めて直面したようです。すぐに2つの主要なランタイムエラーを発見しました。1つは値の伝搬で、もう1つは呼び出し規約と組み合わせたレジスタ割り当てです。この2つのエラーは数十ものテストに関わっていて、全てに実行時のエラーが発生しました。値の伝播は通常、明示的にオンにする必要がある最適化と見なされますが、このコンパイラはデフォルトでそれを適用していたことが注目すべき点です。
アプリケーションにこのように重大なエラーが潜在することがわかったことで(このコンパイラのクオリフィケーションは、顧客の機能安全プロセスの一部であった)、この製品開発プロジェクト全体のスケジュールが脅かされることにもなりました。コンパイラーのクオリフィケーション中に、コンパイラー・ベンダーにエラーを報告し、修正または回避策を待ってから、コンパイラー設定の適切な変更について議論する必要があり、アプリケーション開発プロセスに支障をきたすことになりました。
これは珍しいことではありません。昨年、パイプラインを持つターゲットプロセッサの命令スケジューリングで、エイリアス関係にあるロード命令とストア命令を誤って並べ替えたコンパイラを評価しました。スケジューラは、コンパイルされたプログラムごとに重要な役割を果たします。したがって、毎回うまく動作しなければなりません。
このような落とし穴を避けるために何ができるでしょうか?少なくともコンパイラベンダーにテスト手順を尋ねてください。彼らはSuperTestのような評判の高いテストスイートを通しているでしょうか?
ミッションクリティカルな市場や、安全性が重要な市場でビジネスをしている場合は、使用しているコンパイラの弱点を把握しておく必要があります。エラーを修正できない場合でも、弱点を知ることで、予防的対策を講じたり、回避策を実装したり、機能安全規格で知られる「緩和」策を講じることができます。
また弊社ではコンパイラのクオリフィケーションサービスを提供していますが、SuperTestのライセンスを取得されることもお勧めしています。
SuperTestが有れば、必要となる全てのコンパイラの各バージョンで、様々なオプション設定の組合せで、好きなだけ評価できるので安上がりです。また開発の早い段階で評価することで問題を事前に避けることができますし、そのような経験と知識を社内で蓄積できるようになります。
C/C++コンパイラをテストして妥当性を検証する
ユーザーまでもがコンパイラをテストすべき理由とは?
コンパイラは、非常に複雑なソフトウエアであり、たったひとつのエラーであっても、甚大な問題を引き起こす原因になりかねない。また、ISO 26262 等の機能安全規格では、ソフトウエアツールチェインの適正なレベルの信頼が要求される。そこで、主要コンパイラメーカのみならず、コンパイラを使用する組織が機能安全規格で求められるコンパイラツールの認定にも活用するSuperTestについて、活用事例を交えて紹介する。
■顧客事例
顧客





















■Solid Sands 社について
Solid Sands 社(オランダ・アムステルダム)は、C/C++コンパイラ、ライブラリの品質を改善して安全で安心に利用するための、業界最大クラスのテストおよび検証スイートを提供しています。その製品であるSuperTestは、コンパイラ開発で培った経験を生かして、最新のC/C++言語規格や、解析、最適化技術、 新しいユースケースに最前線で備えています。そしてISOや機能安全規格で要求されるソフトウェア品質を満たすことを支援します。
富士設備工業(株)は、コンパイラとライブラリを包括的にテストするSuperTestを提供するSolid Sands社と代理店契約を締結しました。SuperTestの販売とサポートを通じて、機能安全規格などで要求されている、コンパイラツール自体に潜む不具合が製品システムに影響しないことを確認する作業の軽減に、貢献してまいります。
