令和4年度 秋期 エンベデッドシステムスペシャリスト試験 午前II 問21

プログラム言語Cで作成されたプログラム全体で使用するスタックフレームのサイズが,確保したサイズ内に収まっていることを検証したい。各関数が使用するスタックフレームのサイズ情報に加えて,必要となる情報はどれか。

解答・解説

正解: ウ. 各関数の呼出し関係(呼出しツリー)

プログラム全体で使用するスタックフレームの最大サイズを見積もるためには、同時にメモリ(スタック領域)に存在するスタックフレームの合計サイズを把握する必要があります。

プログラム言語Cにおいて、関数が呼び出されると、その関数用のスタックフレーム(ローカル変数、引数、リターンアドレス、レジスタの退避領域などが含まれる)がスタック領域に割り当てられ、関数が終了すると解放されます。
したがって、各関数のスタックフレームサイズだけでなく、各関数の呼出し関係(呼出しツリー)を把握し、関数が最も深くネストして呼び出される経路におけるスタックフレームサイズの合計を計算することで、スタックオーバーフローが発生しないかを検証できます。

各選択肢の解説

  • ア(各関数が使用するレジスタの退避領域のサイズ):レジスタの退避領域は各関数のスタックフレームに含まれる情報の一部です。これだけでは全体のスタック使用量を算出することはできません。
  • イ(各関数が使用するローカル変数のサイズ):ローカル変数のサイズも各関数のスタックフレームに含まれる情報の一部です。全体のスタック使用量を求めるには、関数の呼出し関係によるネストの深さを知る必要があります。
  • ウ(各関数の呼出し関係(呼出しツリー)):正解。各関数のスタックフレームサイズと、呼出し関係(どの関数がどの関数を呼び出すか、その深さ)を組み合わせることで、同時に割り当てられるスタックフレームの最大サイズを算出できます。
  • エ(グローバル変数の合計サイズ):グローバル変数はスタック領域ではなく、静的データ領域に割り当てられます。そのため、スタックフレームのサイズ検証には無関係です。

Spineチーム