我有以下两个显然都会导致堆栈溢出错误的C代码片段:
a.c
个
int f(int i) {
f(i);
}
int main() {
f(1);
}
b.c
int f(int i) {
f(i+1);
}
int main() {
f(1);
}
在运行两者并查看coredumpsctl list
中产生的结果后,输出大小非常不同:
Tue 2024-02-20 15:38:28 +0330 420696 1000 1000 SIGSEGV present /tmp/a 204.2K
Tue 2024-02-20 15:38:30 +0330 420710 1000 1000 SIGSEGV present /tmp/b 899.7K
第二个程序的(b.c
)核心转储大小是第一个程序的4倍多.这对我来说很奇怪,因为两个程序没有任何明显的区别.有人能解释一下这种行为吗?
编辑
我使用以下命令编译这两个文件:
$ gcc a.c -o a && gcc b.c -o b
我使用的gcc
版本:
$ gcc --version
gcc (Debian 12.2.0-14) 12.2.0
Also assembly generated for a.c
个 (using objdump -S
):
0000000000001129 <f>:
1129: 55 push %rbp
112a: 48 89 e5 mov %rsp,%rbp
112d: 48 83 ec 10 sub $0x10,%rsp
1131: 89 7d fc mov %edi,-0x4(%rbp)
1134: 8b 45 fc mov -0x4(%rbp),%eax
1137: 89 c7 mov %eax,%edi
1139: e8 eb ff ff ff call 1129 <f>
113e: 90 nop
113f: c9 leave
1140: c3 ret
0000000000001141 <main>:
1141: 55 push %rbp
1142: 48 89 e5 mov %rsp,%rbp
1145: bf 01 00 00 00 mov $0x1,%edi
114a: e8 da ff ff ff call 1129 <f>
114f: b8 00 00 00 00 mov $0x0,%eax
1154: 5d pop %rbp
1155: c3 ret
对于b.c
:
0000000000001129 <f>:
1129: 55 push %rbp
112a: 48 89 e5 mov %rsp,%rbp
112d: 48 83 ec 10 sub $0x10,%rsp
1131: 89 7d fc mov %edi,-0x4(%rbp)
1134: 8b 45 fc mov -0x4(%rbp),%eax
1137: 83 c0 01 add $0x1,%eax
113a: 89 c7 mov %eax,%edi
113c: e8 e8 ff ff ff call 1129 <f>
1141: 90 nop
1142: c9 leave
1143: c3 ret
0000000000001144 <main>:
1144: 55 push %rbp
1145: 48 89 e5 mov %rsp,%rbp
1148: bf 01 00 00 00 mov $0x1,%edi
114d: e8 d7 ff ff ff call 1129 <f>
1152: b8 00 00 00 00 mov $0x0,%eax
1157: 5d pop %rbp
1158: c3 ret