スタック破壊検出機能は,-Xstack_protector オプション,-Xstack_protector_all オプションまたは本節で説明する#pragma で実現します。
#pragma stack_protector ( 関数指定 [, 関数指定]... ) 注 関数指定 : 関数名 [ (num=整数値) ] #pragma no_stack_protector ( 関数名 [, 関数名]... ) 注 |
(1) 関数の入口で,ローカル変数領域の直前(0xFFFFFFFF番地に向かう方向)に4バイトの領域を確保し, <数値>で指定した値を確保した領域に格納します。
(2) 関数の出口で,<数値>を格納した4バイトの領域が書き換わっていないことをチェックします。
(3) (2)で書き換わっている場合には,スタックが破壊されたとして__stack_chk_fail 関数を呼び出します。
__stack_chk_fail関数はユーザが定義する必要があり,スタックの破壊検出時に実行する処理を記述します。 |
__stack_chk_fail関数は,オプション-Xstack_protector,-Xstack_protector_allと#pragma stack_protectorによるスタック破壊検出コードの生成の対象にはなりません。 |
PIC(「8.6 PIC/PID機能」を参照してください)である関数に対して本機能を使用する場合,__stack_chk_fail関数もPIC対象としてください。 |
#pragma no_stack_protector が指定された関数は-Xstack_protector オプション,-Xstack_protector_all オプションに関わらず,スタック破壊検出コードを生成しません。 |
#pragma stack_protector と-Xstack_protector オプション,-Xstack_protector_all オプションが同時に使用された場合は,#pragma 指定が有効になります。 |
#pragma inline_asm,#pragma inline,#pragma stack_protector,#pragma no_stack_protector
#pragma stack_protector,#pragma no_stack_protector