Skip to main content

IAR Embedded Workbench for Arm 9.70.x

ランタイムエラー解析の概要

このセクションの内容:

ランタイムエラー解析

ランタイムエラー解析は、アプリケーションの実行中に不正なコードの構造を検出する方法です。これは、アプリケーション内にコードを実装するか、C/C++ ライブラリの機能をランタイムエラー解析をサポートする専用のライブラリに置き換えることにより実行します。

ランタイムエラー解析では、アプリケーションのタイプと実行する環境に応じて、解析の実行にさまざまな方法を使用出来ます。

解析を実行するコードを実装することで、コードサイズが大きくなり、処理速度が低下します。また、解析をサポートするライブラリ関数の派生型も、チェックをサポートしない関数に比べて、一般的にコードサイズが大きくなり速度が低下します。

C-RUN を使用したランタイムエラー解析

C-RUN は、以下の 3 種類のランタイムエラー解析をサポートしています。

  • 算術解析には、整数のオーバフローとアンダーフロー、誤ったシフト、ゼロによる除算、値が変化する変換、switch文における未処理のケースの解析が含まれます。通常は算術解析のオーバヘッドは特に高くはありません。複雑な問題もなく、モジュールごとに有効または無効にすることができます。

  • 境界チェックは、ポインタ経由のアクセスがポイント先のオブジェクトの境界内にあるかどうかをチェックします。境界チェックにはポインタの境界を追跡するためのコードの実装が伴い、コードサイズと速度の両面でコストが比較的高くなります。間接的にアクセスされるポインタのグローバル境界テーブルも必要です。モジュールや関数ごとに追跡やチェックだけを無効にすることができますが、ポインタの境界がすべてのコードで追跡されない設定の場合は通常、何らかのコード調整が必要となります。

  • チェック済みのヒープを使用したヒープチェックでは、ヒープメモリの使用においてエラーがないかチェックします。ヒープチェックでは、ヒープメモリへの間違ったライトアクセス、ダブル・フリー、一致しない割当てと割当て解除、さらに明示的な呼び出しをすることでリークのあるヒープブロックを検出できます。チェック済みヒープを使用すると、各ヒープブロックのメモリサイズが大きくなり、ヒープサイズを増やさなければならないことがあります。また、通常のヒープに比べてヒープの処理に多くの時間がかかる可能性があります。さらに、ヒープ関数が呼び出されたときにだけチェックが行われるため、すべてのヒープライトエラーが検出されるわけではありません。

C-RUN が実行可能なすべてのチェックは、C と C++ のソースコードのどちらについても使用できます。

数種類の C-RUN チェックを同時に有効化することができます。有効化するチェックの種類が増えるごとに、実行時間が長く、コードサイズが大きくなります(増え方が非常に少ないこともあります)。

コンパイラが複数のチェックを 1 つにまとめたり、ループからチェックを移動することもあります。この場合、実際のアクセスよりずっと前に問題が検出される可能性があります。このような場合、C-RUN のメッセージに問題のソース位置が現在の位置とは別に表示されます。

C-RUN のランタイムチェックを実行する前に、問題を見つけるためにコンパイラのあらゆる機能を使用してください。

  • K&Rスタイルの関数の宣言は使用せず、代わりにプロトタイプスタイルを使用してください。‑‑require_prototypes』の‑‑require_prototypesをお読みください。

  • ランタイムチェックを実行する前に、あらゆるコンパイラのワーニングに注意してください。ほとんどの場合、一度ワーニングが表示された問題をチェックするコードは出力されません。以下に例を示します。

    unsigned char ch = 1000; /* Warning: integer truncation */

    整数の変換チェックが有効の場合であっても、出力されたコードにはこの場合のチェックはまったく含まれません。単に値232(1000 & 255)をchに割り当てるだけのコードです。

注記

C-RUN は、ARM のセミホスティングインターフェースに依存します(ライブラリ関数 __iar_ReportCheckFailed は、セミホスティングインターフェースを通じて C-SPY とやりとりします)。別の低レベルの I/O インターフェースは、非対話型モードでのみ使用可能です。非対話型モードでの C-RUN の使用 non-interactive modeを参照してください。

エラーの検出方法については、さまざまなランタイムエラーの検出を参照してください。

ライブラリにより提供されるチェック済みヒープ

チェック済みヒープを提供するライブラリがあり、これを使用してヒープの使用をチェックすることができます。チェック済みヒープは、ヒープブロックのユーザ部分の前後にガードバイトを挿入するほか、各ブロックに追加情報(連続する割当て番号を含む)を格納して、レポートに役立てます。

それぞれのヒープ処理では通常、ガードバイトあるいは新しく割り当てられたヒープメモリの内容の変更に対して、関係する各ヒープブロックがチェックされます。特定の場合(特定の呼び出しによるトリガ、または設定したヒープ処理の回数を超過した場合)、ヒープの整合性チェックが実行され、問題がないかどうかヒープ全体がチェックされます。

チェック済みヒープは間違ったリードアクセスを検出することはできない点を十分に理解してください。解放されたヒープブロックからのリードや、割り当てられたヒープブロックの境界の外でのリードなどです。これらのアクセスやチェック済みヒープで見過ごされがちな数多くの間違ったライトアクセスは境界チェックで検出することができます。境界チェックではガードバイトやチェック済みバイトにライトすることがないためです。または、チェック済みヒープはヒープ処理の使用時にのみチェックを行い、実際のアクセス時点にはチェックを実行しません。

IAR Embedded Workbench IDE での C-RUN の使用

C-RUN は IAR Embedded Workbench IDE に完全に統合されており、以下の機能を提供します。

  • 検出された各エラーについて詳しいエラー情報がコールスタック情報とともに提供され、エラーに関するコードとの相関関係とフィードバックがエディタウィンドウに表示されます。

  • プロジェクトレベル、ファイルレベルまたは指定のコード位置における個々のランタイムエラーに対して、実行の停止、ログ、無視するようにエラールール管理できます。フィルタ設定をロード/セーブすることができます。

  • 各メッセージについてエディタウィンドウでブックマークを設定できるため、メッセージ間の移動が容易(F4を使用)。

IDE では、C-RUN に以下のウィンドウが用意されています。

  • [C-RUNメッセージ]ウィンドウはC-RUNが生成するすべてのメッセージが一覧表示されます。各メッセージにはメッセージタイプ(実行されたチェックを反映)、問題を説明する文、コールスタックが含まれます。対応するソースコード文は、エディタウィンドウで強調表示されます。[C-RUN メッセージ]ウィンドウを参照してください。

  • [C-RUNメッセージルール]ウィンドウには、すべてのルールが一覧表示されます。[C-RUN メッセージルール]ウィンドウを参照してください。ルールによって、[C-RUNメッセージ]ウィンドウに表示されるメッセージが決まります。

非対話型モードでの C-RUN の使用 non-interactive mode

C-RUN でチェック済みのプログラムは、cspybat を用いて C-SPY をバッチモードで使用して実行できます。cspybat は、Workbench IDE で設定されたルールや他の設定を使用することができます。cspybat の C-RUN メッセージは、デフォルトでホスト stdout に報告されますが、ファイルにリダイレクトすることができます。

アプリケーションと C-RUN メッセージのホスト間で独自の通信チャンネルを使用する場合は、関数__iar_ReportCheckFailed(通信にセミホスティングインターフェースを使用)を独自のバージョンに置換すれば、どれでも希望する通信インターフェースを使用できます。ソースファイルReportCheckFailedStdout.c (arm\src\lib\crun)には、アプリケーションのstdout に報告する派生型があります。セミホスティングのものではなく、独自のレポート関数を使用するには、リンカオプション ‑‑redirect __iar_ReportCheckFailed=__iar_ReportCheckFailedStdoutを使用します。

注記

レポート関数のモジュールがプロジェクトに挿入されている場合、そのモジュールは C-RUN のソースコードオプションでコンパイルしないでください。

__iar_ReportCheckFailedStdoutからの出力には raw データしかないため、ユーザは読み取りできません。シミュレーター・ドライバで cspybat を使用すると、raw テキストを通常の C-RUN メッセージに近いものに変換できます。詳細については、‑‑rtc_raw_to_txtを参照してください。

オプション‑‑rtc_enableを使用して、cspybatで C-RUN を有効化します。C-RUN 用の cspybat オプションはすべて、‑‑rtc_* で始まります。これらのオプションについては、C-RUNのcspybatオプションを参照してください。

ランタイムエラー解析の要件

ランタイムエラー解析を実行するには、IAR Embedded Workbench のアドオン製品である C-RUN が必要です。