(1) 関数の入口で,当該関数スタック・フレームのローカル変数領域の直前(0xFFFFFFFF番地に向かう方向)に4バイトの領域を確保し,numで指定した値を確保した領域に格納します。
(2) 関数の出口で,numを格納した4バイトの領域が書き換わっていないことをチェックします。
(3) (2)で書き換わっている場合には,スタックが破壊されたとして __stack_chk_fail 関数を呼び出します。
__stack_chk_fail関数はユーザが定義する必要があり,スタックの破壊検出時に実行する処理を記述します。 |
__stack_chk_fail関数は,オプション-Xstack_protector,-Xstack_protector_allと#pragma stack_protectorによるスタック破壊検出コードの生成の対象にはなりません。 |
-Xstack_protectorを指定すると,関数が持つ構造体,共用体または配列のローカル変数に対して,コンパイラが8byteを超えるオブジェクトとしてスタックに領域を確保する場合に,スタック破壊検出コードを生成する対象となります。-Xstack_protector_all を指定した場合には全ての関数に対してスタック破壊検出コードを生成します。 |
以下の#pragma が指定された関数は,本オプションを指定した場合でもスタック破壊検出コードを生成しません。 |