1.8.5 プログラム終了および assert マクロ

プログラムは、通常は main() の終わりで終了しますが、エラーが原因で途中で終了する場合もあります。assert マクロの動作は、いくつかの条件によって異なります。

  1. (コマンドラインで、またはソースファイルの一部として)NDEBUG マクロが定義されている場合、assert マクロは何の影響も及ぼしません。
  2. NDEBUG マクロが定義されていない場合は、assert 式(assert マクロに与えられた式)が評価されます。結果が TRUE、つまり != 0 の場合、assert マクロはそれ以降何の影響も及ぼしません。
  3. assert 式が FALSE と評価されたときは、以下のいずれかが True の場合に assert マクロによって __aeabi_assert() 関数が呼び出されます。
    • --strict を使用したコンパイル中。
    • -O0 または -O1 を使用したコンパイル中。
    • __ASSERT_MSG が定義されている。
    • _AEABI_PORTABILITY_LEVEL が定義済みで、0 以外。
  4. assert 式が FALSE と評価され、上記の 3 で指定された条件に対応しない場合には、assert マクロによって、abort() が呼び出されます。次に、以下の手順を実行します。
    1. abort()__rt_raise() を呼び出します。
    2. __rt_raise() が復帰した場合は、abort() によってライブラリの終了が試みられます。
ライブラリを使用しないアプリケーションを作成している場合、__aeabi_assert() は、abort()stdio 関数が再実装されている場合に機能します。
ターゲット変更の別の解決策として、__aeabi_assert() 関数自体を再実装する方法があります。以下はこの関数のプロトタイプです。
void __aeabi_assert( const char *expr, const char *file, int line);
各項目には以下の意味があります。
  • expr TRUE とならなかった式の文字列表現を指しています。
  • file および line は、アサートのソースの位置を識別します。
ARM C ライブラリで提供されている __aeabi_assert() の動作では、stderr にメッセージを出力し、abort() を呼び出します。
関連する概念
1.8 新しい実行環境に合わせた C ライブラリのカスタマイズ
非機密扱いPDF file icon PDF 版ARM DUI0808CJ
Copyright © 2014, 2015 ARM.All rights reserved.