Light C | ← → 目次 索引 |
作成したプログラムを実行したときに、以下のエラー メッセージが表示される場合があります。
プログラムのどこかで NULL ポインタの参照先に誤ってデータを書き込んだことを示します。このランタイム エラーは、プログラムの誤りを発見しやすくする目的で用意されています。
Light C で作成したプログラムでは、DGROUP の先頭に置かれる定数データ セグメント kseg の先頭に、_null_area という 4 バイトのデータが自動的に確保されます。main() 関数の終了後にこの領域がチェックされ、初期値と異なる値が設定されていると、このランタイム エラーが発生します。この場合は、NULL 値を持つ near ポインタの参照先に対して、言い換えれば ds:0000h に対して、書き込みが行われた可能性が高いと考えられます。
このチェックは、既定では main() 関数の終了後に、既定のスタートアップ ルーチン start.asm で行われます。プログラムの任意の場所で、_nullptr_chk() を呼び出してチェックを行うこともできます。
_nullptr_chk() は、エラーを検出すると raise( _SIGNULLPTR ) を呼び出します。signal を使用すれば、独自のハンドラ関数を定義できます。
この検査は、near ポインタについてのみ有効です。
オプション -gs を指定しない限り、スタック オーバーフローを検出するために、各関数の先頭にスタック ポインタの値を検査するコードが挿入されます。
このランタイム エラーが発生した場合は、関数呼び出しの入れ子レベルが多いか、局所変数のサイズが大きいために、スタックが不足しています。または、関数が無限に再帰的に呼び出されています。
スタック検査は、_stack_chk() 関数で行われます。ライブラリ関数内ではスタック チェックが行われないため、ライブラリ関数が使用するスタックも顧慮して、スタックの残りサイズが約 700 バイトになるとエラーと判定します。ライブラリ ソース signal.c で _stack_chk() の定義を書き換えれば、この動作を変更できます。
スタック サイズの既定値は 4096 バイトで、ライブラリ ソース start.asm で定義されています。スタックを拡大するには、オプション -stk を使用するか、start.asm を書き換えます。_rest_stack() または _min_stack() を使用すると、残存スタック サイズを取得できます。
_stack_chk() は、エラーを検出すると raise( _SIGSTKOVER ) を呼び出します。既定の _SIGSTKOVER ハンドラは、メッセージを表示してプログラムを中止します。signal で独自のハンドラ関数を定義することもできます。-os:none を指定した場合は、既定の raise( _SIGSTKOVER ) が何も行わないので注意してください。
メモ small/compact メモリ モデルで定義した far 関数には、スタック検査コードは挿入されません。
abort() 関数が呼び出されたため、プログラムを中断しました。
R.1000 null pointer assignment
R.1010 stack overflow
R.1100 abnormal termination
Copyright © Tama Software Ltd, 1999-2012. | ← → 目次 索引 |