バグは早い段階で、自動検出したい


 アドレスサニタイザによるメモリバグ自動検出

組込みソフトウエアの不具合で最も多い原因のひとつがメモリ破壊と言われています。結合テストの段階で発生した不具合は、その現象から原因をつきとめるのに複数の要因が考えられるため、どうしても「人海戦術」や場合によっては不具合の影響が広範囲に及び「モグラ叩き」になってしまうことがあります。
SOLIDでは、「メモリ破壊を起こしていても、まだその影響が何も起きていない」単体テスト段階でバグを自動検出できるアドレスサニタイザ機能を実現しています。

メモリ破壊は初心者だけでなく誰でもうっかり作り込んでしまうものです。結合テストで他人に指摘される前に、不具合を見つけて自分のコードを修正しておきましょう。


アドレスサニタイザ

アドレスサニタイザは、LLVM/Clang コンパイラのデバッグ・テスト支援機能の一つで、メモリ破壊や リークなどを実行時に検出する動的解析機能です。使い方は簡単。アドレスサニタイザモードでビルドして実行するだけです。自分で考えてブレークポイントを設定するなど必要ありません。SOLID-IDE と SOLID-OS が連携して、間違ったメモリアクセスを自動的にあぶり出してくれます。


アドレスサニタイザが検出できるメモリ破壊バグ

アドレスサニタイザを使うと次のようなメモリ破壊バグが自動的に検出できます。

 ローカル変数、グローバル変数の、オーバーランや未定義領域アクセス
 スタックオーバーフロー
 memcpy()など連続するメモリアクセスも、SOLID専用ライブラリの利用で検出可能


アドレスサニタイザが何故便利なのか

通常デバッグ段階では、何等かの不具合によりメモリが破壊「された」ことを起点に、破壊されたメモリ箇所にイベントブレークを設定し、その際のプログラム履歴を取って不具合箇所をたどる方法が一般的です。ただしこの方法では、メモリ破壊が起きた結果として何等かの影響が出なければ、潜在的なバグとして見逃されてしまう可能性があります。

 アドレスサニタイザは、バッファオーバーランや未定義領域のアクセスといった、プログラムの代表的なメモリ破壊に関わる不具合検出を自動的に行う機能です。自動的とは、つまり「不具合箇所の見当を付ける必要がない」ということです。対象のプログラムが不当なメモリアクセスを行った瞬間に、「たとえ不具合症状が起きていなくても」あたかも自己申告するように、アドレスサニタイザが不当動作をあぶり出すのです。

 カジュアルテスト(設定が簡単)で不具合が検出できる
 メモリ破壊バグを自動的にあぶり出す
 対象メモリアドレスの絞り込みが不要
 潜在的不具合を後工程に渡さない


アドレスサニタイザの仕組み
~MMUを活用したメモリ管理~

アドレスサニタイザ機能では、MMUが重要な役割を果たしています。 MMUを活用することで、各機能(モジュール)を仮想アドレス上に分散して配置できるため、その間にガード領域を設けることにより、領域外アクセスであるバッファオーバーランの検出や、特定のメモリ領域に対してアクセス制限をするセキュリティ管理が可能になります。

また、SOLIDでは「コアサービス」と名付けた一連のランタイムがIDEと密接に連携して動作しています。アドレスサニタイザ機能では、コアサービスがアクセス対象のアドレスの有効無効を判断し、無効なアドレスと判定した場合にプログラムをブレークしてデバッガに通知します。
なお、アドレスサニタイザを有効にしたモジュールでは、メモリアクセス判定サイクルによるオーバーヘッドが発生します。