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