スタック破壊検出コードの生成(#pragma stack_protector/#pragma no_stack_protector) 【Professional 版のみ】 【V1.02以降】


関数の入口および出口にスタック破壊を検出するコードを生成します。

[機能]

-

関数の入口・出口にスタック破壊検出コードを生成します。スタック破壊検出コードとは次に示す3つの処理を実行するための命令列を指します。

(1) 関数の入口で,ローカル変数領域の直前(0xFFFF番地に向かう方向)に2バイトの領域を確保し,その領域にnumで指定した値を格納します。

(2) 関数の出口で,numを格納した2バイトの領域が書き換わっていないことをチェックします。

(3) (2)で書き換わっている場合には,スタックが破壊されたとして__stack_chk_fail関数を呼び出します。

-

numには0から65535までの10進数または16進数の整数値を指定します。numの指定を省略した場合には,コンパイラが自動的に数値を指定します。

-

__stack_chk_fail関数はユーザが定義する必要があり,スタックの破壊検出時に実行する処理を記述します。

-

__stack_chk_fail関数を定義する際には,次の項目に注意してください。

-

戻り値および引数の型をvoid型とし,far領域に配置してください。

-

static関数にしないでください。

-

通常の関数のように呼び出すことは禁止します。

-

__stack_chk_fail関数は,オプション-stack_protector,-stack_protector_allと#pragma stack_protectorに関わらずスタック破壊検出コードの生成の対象にはなりません。

-

関数内ではabort()を呼び出してプログラムを終了させるなど,呼び出し元であるスタックの破壊を検出した関数にリターンしないようにしてください。

-

#pragma no_stack_protectorが指定された関数は,-stack_protectorオプション,-stack_protector_allオプションに関わらず,スタック破壊検出コードを生成しません。

[効果]

-

スタックを上書きするか破損する悪質なコードまたはプログラム・エラーに対する保護を提供する。

[方法]

-

関数の最初の宣言より前で#pragma stack_protector/#pragma no_stack_protectorを宣言します。

#pragma stack_protector [(]関数名[(num=数値)][)]
#pragma no_stack_protector [(]関数名[)]

[制限]

-

-stack_protectorオプションまたは-stack_protector_allオプションと同時に使用した場合は,#pragma stack_protector/#pragma no_stack_protector指定が有効になります。

-

#pragma stack_protectorで指定した関数が次のいずれかの関数として指定されている場合,エラーメッセージを出力します。

#pragma inline,__inlineキーワード,#pragma inline_asm,#pragma no_stack_protector,#pragma rtos_interrupt,#pragma rtos_task