ランタイム エラー

作成したプログラムを実行したときに、以下のエラー メッセージが表示される場合があります。

R.1000 null pointer assignment

プログラムのどこかで NULL ポインタの参照先に誤ってデータを書き込んだことを示します。このランタイム エラーは、プログラムの誤りを発見しやすくする目的で用意されています。

Light C で作成したプログラムでは、DGROUP の先頭に置かれる定数データ セグメント kseg の先頭に、_null_area という 4 バイトのデータが自動的に確保されます。main() 関数の終了後にこの領域がチェックされ、初期値と異なる値が設定されていると、このランタイム エラーが発生します。この場合は、NULL 値を持つ near ポインタの参照先に対して、言い換えれば ds:0000h に対して、書き込みが行われた可能性が高いと考えられます。

このチェックは、既定では main() 関数の終了後に、既定のスタートアップ ルーチン start.asm で行われます。プログラムの任意の場所で、_nullptr_chk() を呼び出してチェックを行うこともできます。

_nullptr_chk() は、エラーを検出すると raise( _SIGNULLPTR ) を呼び出します。signal を使用すれば、独自のハンドラ関数を定義できます。 この検査は、near ポインタについてのみ有効です。

R.1010 stack overflow

オプション -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 関数には、スタック検査コードは挿入されません。

R.1100 abnormal termination

abort() 関数が呼び出されたため、プログラムを中断しました。