平成31年度 春期 エンベデッドシステムスペシャリスト試験 午前Ⅱ 問21
テクノロジ/開発技術C 言語で作成されたプログラム全体で使用するスタックフレームのサイズが,確保したサイズ内に収まっていることを検証したい。各関数が使用するスタックフレームのサイズ情報に加え,必要となる情報はどれか。
出典:平成31年度 春期 エンベデッドシステムスペシャリスト試験 午前Ⅱ 問21
- ア各関数が使用するレジスタの退避領域のサイズ
- イ各関数が使用するローカル変数のサイズ
- ウ各関数の呼出し関係(呼出しツリー)
- エグローバル変数の合計サイズ
正解:ウ
解説
プログラム全体で実際に使用されるスタックフレームの最大サイズは,ある時点で同時に積み重なる(ネストする)関数呼出しの深さに依存します。各関数単体が使用するスタックフレームのサイズが分かっていても,どの関数がどの関数を呼び出すか(呼出し関係,呼出しツリー)が分からなければ,最も深くネストしたときに必要となるスタックフレームの合計サイズ(最悪ケースのスタック使用量)を求めることができません。
選択肢ごとの解説
- ア誤り。各関数が使用するレジスタの退避領域のサイズは,通常その関数自身のスタックフレームのサイズに既に含まれている情報であり,スタック使用量全体の検証に別途必要となる追加情報ではありません。
- イ誤り。各関数が使用するローカル変数のサイズも,通常その関数自身のスタックフレームのサイズに既に含まれている情報であり,別途必要となる追加情報ではありません。
- ウ正しい。プログラム全体での最大スタック使用量は,関数呼出しがどれだけ深くネストするかによって決まるため,各関数のスタックフレームサイズに加えて,関数の呼出し関係(呼出しツリー)の情報が必要です。
- エ誤り。グローバル変数は静的に確保される領域であり,スタックフレーム(関数呼出しのたびに動的に確保される領域)には含まれないため,スタックフレームの合計サイズの検証には直接関係しません。