Solid Sands 社の SuperTestは、コンパイラを検証するためのテストスイートです。その派生製品であるSuperGuardは、 C/C++ 標準ライブラリの認定を支援する要件ベースのテストスイートです。コンパイラは、非常に複雑なソフトウエアであり、たったひとつのエラーであっても、間違ったコードが生成されることで甚大な問題を引き起こす原因になりかねません。ISO 26262 等の機能安全規格では、ソフトウエアツールチェインの適正なレベルの信頼が要求されます。コンパイラが正しいことの証明には、C、C++言語規格への適合性、正確性、堅牢性を厳密にテストすることが必要です。
コンパイラのユーザーがコンパイラをテストすべき理由とは?
コンパイラユーザーの声
「コンパイラをバージョンアップする時にSuperTestでチェックして、使ってはいけない最適化などの社内ルールを施行することで、過去のバージョンに戻さなければならないような問題が起こらなくなった。」
「C99 コンパイラなのにC89のライブラリが混同されていて、sin, cosなどの数学関数で問題になるところを、事前に回避できた。」
「自動運転などで画像認識等はC++のライブラリに依存することになるので、SuperTestのライブラリテスト機能にも注目している。Float16、AUTOSAR C++14 など」
SuperTest
高いレベルのコンパイラ品質
Solid Sands 社の SuperTestは、コンパイラ品質への信頼を得るためのコンパイラテストと検証のためのテストスイートです。業界最大クラスのコンフォーマンステストとともにテストファイルが提供され、コンパイラの開発者のみならず、コンパイラを使用する組織やその品質管理部門が、機能安全規格の要件(コンパイラの不具合が製品システムに影響しないことを確認する)を満たすことや、コンパイラによって間違ったコードが生成されることを未然に防ぐことを目的に活用しています。
これにはコンパイラによる解析、変換、最適化を評価する多くのテストも含まれます。また、このテスト群や特別な機能は、継続的に追加されています。フレームワークには、コンフォーマンステストと診断テストの両方が組み込まれています。診断テストは、不正なプログラムに対するコンパイラエラーを検証します。またフレームワークには、テストスイートのサブセットを選択する機能があり、以前にフェイルしたテストを再実行するなどの柔軟性を備えています。POSIXベースのユーザインターフェイスは直感的であり、あらゆるコンパイラ開発環境とシームレスに統合できるので、新しいテストの追加やクロスプラットフォームでの検証サポートをも容易に行えます。
- 手書きのテストの膨大なコレクション
- 検証を簡単にセットアップして実行するための構成可能なテストドライバー
- HTMLやJUnitXMLを含む複数の形式で検証結果の包括的な概要を提供し、指定されたバージョンと比較した最新のコンパイラおよびライブラリーのリグレッションを即座に識別するレポートジェネレーター

次のISO仕様をカバーしています
- ISO/IEC 9899:1990 C90 standard
- ISO/IEC 9899:1999 C99 standard
- ISO/IEC 9899:2011 C11 standard
- ISO/IEC 9899:2018 C18 standard
- ISO/IEC TR 18037:2008 Embedded C extension
- ISO/IEC 14882:2003 C++03
- ISO/IEC 14882:2011 C++11
- ISO/IEC 14882:2014 C++14
- ISO/IEC 14882:2017 C++17
- ISO/IEC 14882:2020 C++20

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++言語のプログラムを構成する要素には文字列処理や数学関数のようにプログラム実行時に必要となるソフトウェア部品があります。アプリケーションプログラムが安全であるためには、コンパイラが生成するオブジェクトコードの部分だけでなく、これらも検証することが必要です。実行時に必要となるこのようなソフトウェア部品は実行時ライブラリと呼ばれますが、その中で言語規格で定義されているものを標準ライブラリと呼び、プログラム開始時に必要となるスタートアップルーチンや例外処理ルーチンなどを実行時ライブラリとして区別することもあります。この記事では、標準ライブラリと実行時ライブラリに関するSuperTestでの検証について紹介しています。
SuperGuard C/C++ 標準ライブラリの認定
ライブラリのコードはアプリケーションとリンクしてターゲットデバイス上で実行されます。そのため、ライブラリコンポーネントに欠陥があるとアプリケーション全体の機能安全が危険にさらされるので、ソフトウェアライブラリの認定が不可欠です。ソフトウェアライブラリの使用に対して機能安全規格それぞれで独自の目標がありますが、一般的には、ライブラリの実装がその仕様に準拠していることを検証するという目標は共通です。
この課題を克服するため、Solid Sands 社はライブラリ認定ツール SuperGuard C/C++ Library Safety Qualification Suite を開発しました。これは、個々のテスト結果と ISO C/C++ 言語仕様から派生する要件とを結びつける完全なトレーサビリティを備えた C/C++ 標準ライブラリに対する要件ベースのテストスイートです。

ソフトウェア開発 V 字モデルにおけるSuperGuard の役割
言語仕様に基づいたテストスイートで C/C++ コンパイラを認定するの講演動画
C/C++ コンパイラの認定は、機能安全規格 ISO 26262 の第8-11項の定義によって行うが、ツール信頼度の評価後に C、C++ 言語規格への準拠を評価することが一般的である。コンパイラは巨大で非常に複雑なソフトウエアであることに加え、オプション等のユースケースの組合せは膨大であることなど、その開発プロセスを評価して認証するのは現実的でないためだ。Solid Sands 社の SuperTest は、全バージョンの C/C++ 言語規格書の章立てに基づくテストスイートとテストドライバで、コンパイラの言語規格への適合性、正確性、堅牢性を厳密にテストし、トレーサビリティも提供する。これはプロジェクト固有のユースケースに応じたコンパイル・実行環境で検証可能であり、日本を含む世界中で使用されている。本講演ではその概要をご紹介する。
Solid Sands社 CTO Dr. Marcel Beemster @自動車機能安全カンファレンス 2023 の講演動画(日本語字幕付き)を公開
コンパイラ認定と言語サブセットの相互補完による 安全・安心なソフトウェア
自動車機能安全カンファレンス 2022 講演動画を公開
概要:安全・安心なソフトウェアのためには、C、C++言語が持つセキュリティや安全性の弱点をコーディング規約による言語サブセットで排除することに加えて、正しく実装されたソースコードのプログラムとしての動作がオブジェクトコードレベルで保持されることの確信を得る必要があり、コンパイラがC、C++言語規格に準じて正しく動作し、規格どおりに振る舞うオブジェクトコードを生成することの評価が求められる。機能安全システムの開発で、これらの側面がどのように協調して安全性の向上に寄与するかを説明し、また適切に考慮されることで開発時間と費用の軽減にも貢献することを紹介する。

コンパイラの品質と機能安全 (ユーザーがコンパイラをテストすべき理由)
自動車機能安全カンファレンス 2021 講演動画を公開

C/C++コンパイラをテストして
妥当性を検証する
コンパイラは、非常に複雑なソフトウエアであり、たったひとつのエラーであっても、甚大な問題を引き起こす原因になりかねない。また、ISO 26262 等の機能安全規格では、ソフトウエアツールチェインの適正なレベルの信頼が要求される。そこで、主要コンパイラメーカのみならず、コンパイラを使用する組織が機能安全規格で求められるコンパイラツールの認定にも活用するSuperTestについて、活用事例を交えて紹介する。
関連記事
「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が有れば、必要となる全てのコンパイラの各バージョンで、様々なオプション設定の組合せで、好きなだけ評価できるので安上がりです。また開発の早い段階で評価することで問題を事前に避けることができますし、そのような経験と知識を社内で蓄積できるようになります。
