適当に調べてみました。
gcc version 7.3.0 (Rev2, Built by MSYS2 project)
Target: i686-w64-mingw32
c
1#include <stdio.h>
2
3int main(void);
4
5void func(int a, int b, int c){
6 char buf1[5];
7 char buf2[10];
8
9 puts("----------------------------------------------");
10 printf("(&a)[-1]=%p\n", (&a)[-1]);
11 printf(" =main+0x%04x\n",((&a)[-1])-(int)main);
12 printf("call to = %d\n", ((int*)((&a)[-1]))[-1]);
13 printf("func-return_ptr= %d\n", (char*)func - (char*)((&a)[-1]));
14 printf("(&a)[-2]=%p\n", (&a)[-2]);
15 printf("&a-2 = %p\n", &a-2);
16 printf("(&a)[-3]=%p\n", (&a)[-3]);
17 printf("&a-3 = %p\n", &a-3);
18 printf("(&a)[-4]=%p\n", (&a)[-4]);
19 printf("&a-4 = %p\n", &a-4);
20 printf("a = %p\n", &a);
21 printf("b = %p\n", &b);
22 printf("c = %p\n", &c);
23 printf("buf1 = %p\n", buf1);
24 printf("buf2 = %p\n", buf2);
25 if(a == 1)
26 func(a+1,b,c);
27}
28
29int main(void){
30 func(1, 2, 3);
31 return 0;
32}
結果が
----------------------------------------------
(&a)[-1]=00401761
=main+0x002a
call to = -417
func-return_ptr= -417
(&a)[-2]=0028FEE8
&a-2 = 0028FEC8
(&a)[-3]=008717AC
&a-3 = 0028FEC4
(&a)[-4]=0000001E
&a-4 = 0028FEC0
a = 0028FED0
b = 0028FED4
c = 0028FED8
buf1 = 0028FEBB
buf2 = 0028FEB1
----------------------------------------------
(&a)[-1]=00401734
=main+0xfffffffd
call to = -372
func-return_ptr= -372
(&a)[-2]=0028FEC8
&a-2 = 0028FE98
(&a)[-3]=FFFFFFFE
&a-3 = 0028FE94
(&a)[-4]=14CDF076
&a-4 = 0028FE90
a = 0028FEA0
b = 0028FEA4
c = 0028FEA8
buf1 = 0028FE8B
buf2 = 0028FE81
小さい
buf2
buf1
不明
不明
スタックフレームポインタ
戻り先アドレス
a
b
c
大きい
ですね
不明箇所は再帰して同箇所で読んでるのにも関わらず不定なので、未使用もしくはレジスタの退避のようです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。