void myFunc(char dummy) {
char *addrFirstArg = &dummy;
}
int main() {
char dummy = 42;
myFunc(dummy);
return 0;
}
위에서 gdb를 실행하고 myFunc에 중단 점을 추가합니다. addrFirstArg 값을 계산하고 검토하기 위해 한 번 단계를 밟습니다.함수에 인수로 char을 전달하면 스택의 기본값이 아닌 위치에 저장됩니다.
또한
info frame프레임 myFunc에 대한 정보를 출력합니다. 늘어나는만큼 C 스택 구현 내 이해가 간다, 그 addrFirstArg 프레임 myFunc에 대한 기본 포인터 위에 8 바이트 있어야합니다. 대신하는 0x14 바이트 EBP 이하 더미의 주소 0xffffd094 같이 위치 0xffffd0a8, 행
(gdb) p &dummy
$1 = 0xffffd094 "*\202\f\b\032\004"
(gdb) info frame
Stack level 0, frame at 0xffffd0b0:
eip = 0x8048330 in findStackBottom (reporter.c:64); saved eip 0x8048478
called by frame at 0xffffd170
source language c.
Arglist at 0xffffd0a8, args: dummy=42 '*'
Locals at 0xffffd0a8, Previous frame's sp is 0xffffd0b0
Saved registers:
ebp at 0xffffd0a8, eip at 0xffffd0ac
(gdb) x/1c 0xffffd0b0
0xffffd0b0: 42 'a'
따라서, 프레임 MYFUNC 내부 EBP 점수
이
는 I 참조 출력 인 그 위에 0x8 바이트가됩니다.더미가 int로 선언되고 myFunc이 int 인수로 선언되면이 '불일치'가 사라집니다.
저는이 동작에 정말 흥미가 있습니다. 재현 가능 - 여러 번 실행했습니다.
와우 .. 자세한 신속한 답변을 주셔서 감사합니다. 정말 통찰력이 있습니다. 질문을하기 전에 더 많은 생각을 가졌어야합니다. AHA 효과가 좋았을 것입니다. :) – Vighnesh