2.5.3. プログラムからの終了処理

プログラムは、通常は main() の終わりで終了しますが、エラーが原因で途中で終了する場合もあります。

アサートからの終了

assert マクロの動作は、直近の #include <assert.h> の行により定義された演算の条件によって異なります。

  1. (コマンドラインで、またはソースファイルの一部として)NDEBUG マクロが定義されている場合、assert マクロは何の影響も及ぼしません。

  2. NDEBUG マクロが定義されていない場合は、assert 式(assert マクロに与えられた式)が評価されます。 結果が TRUE、つまり != 0 の場合、assert マクロはそれ以降何の影響も及ぼしません。

  3. assert 式が FALSE と評価されたときは、以下のいずれかが True の場合に assert マクロによって __aeabi_assert() 関数が呼び出されます。

    • --strict を使用したコンパイル中

    • -O0 または -O1 を使用したコンパイル中

    • --library_interface=aeabi_clib または --library_interface=aeabi_glibc を使用したコンパイル中

    • __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);

各引数には以下の意味があります。

  • exprTRUE とならなかった式の文字列表現を指しています。

  • file および line は、アサートのソースの位置を識別します。

ARM C ライブラリで提供されている __aeabi_assert() の動作では、stderr にメッセージを出力し、abort() を呼び出します。

__aeabi_assert() のデフォルトの動作をより高い最適化レベルで復元するには、__ASSERT_MSG を定義します。

Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0349AJ
Non-Confidential