低レベルなヒトの覚え書き

●LSI C-86のエラー

2. 「NULL pointer assignment」(と見せかけて、本当はスタックオーバーフロー)


[実験 - その2]

目的は、関数の呼び出しとスタックの消費の関係を調べること。 とりわけ、引数や戻り値の影響に注目しました。
材料に用いたプログラムをリスト5に示します。

[リスト5]
 | #include<stdio.h>
 | #include<malloc.h>
 | void sub1();
 | void sub2(int xa);
 | int sub3();
 | void sub4();
 | void sub5(int xb);
 | int sub6();
 | int main() {
 |   printf("main : %d\n", stackavail());
 |     /* sub1();  *//* パターン1: 引数なし、戻り値なし */
 |     /* sub2(1); *//* パターン2: 引数あり、戻り値なし */
 |     /* sub3();  *//* パターン3: 引数なし、戻り値あり */
 |     /* sub4();  *//* パターン4: 2階層のパターン1 */
 |     /* sub5(1); *//* パターン5: 2階層のパターン2 */
 |     /* sub6();  *//* パターン6: 2階層のパターン3 */
 |   return 0;
 | }
 | void sub1() {
 |   printf("sub1 : %d\n", stackavail());
 | }
 | void sub2(int xa) {
 |   xa++;
 |   printf("sub2 : %d\n", stackavail());
 | }
 | int sub3() {
 |   printf("sub3 : %d\n", stackavail());
 |   return 0;
 | }
 | void sub4() {
 |   printf("sub4 : %d\n", stackavail());
 |   sub1();
 | }
 | void sub5(int xb) {
 |   xb++;
 |   printf("sub5 : %d\n", stackavail());
 |   sub2(xb);
 | }
 | int sub6() {
 |   printf("sub6 : %d\n", stackavail());
 |   sub3();
 |   return 0;
 | }

結果は表4のとおり。

[表4]
 ----------------------------------------------------------
                                    スタック残量表示
         パターン              main      1階層目   2階層目
 ----------------------------------------------------------
   mainのみ                     2490
   sub1(引×戻×)               2490      2488
   sub2(引○戻×)               2490      2488
   sub3(引×戻○)               2490      2488
   sub4(引×戻×,引×戻×)      2490      2488      2488
   sub5(引○戻×,引○戻×)      2490      2486      2484
   sub6(引×戻○,引×戻○)      2490      2488      2486
 ----------------------------------------------------------

sub4のパターンで2階層目のところに変化がないのは、何となく納得できるのですが、sub5のパターンだけ1階層目の減り幅が大きい理由は、よくわかりません。

→トップ , →ひとつ上(lsic2)


R.2: 2006/08/01
Copyright (C) 2005,2006 A.Satoshi