下面是我在 Wikipedia 上看到的代码.这会导致堆栈溢出吗?
#include <stdio.h>
#include <ucontext.h>
#include <unistd.h>
int main(int argc, const char *argv[]){
ucontext_t context;
getcontext(&context);
puts("Hello world");
sleep(1);
setcontext(&context);
return 0;
}
原因:当代码到达 setcontext()
时,它会将新帧压入堆栈。由于 setcontext()
没有返回,它被推送的帧将保留在堆栈中。由于程序处于无限循环中,它会继续将新帧插入堆栈,从而导致堆栈溢出。
最佳答案
gdb 另有说明:
(gdb) list
1 #include <stdio.h>
2 #include <ucontext.h>
3 #include <unistd.h>
4
5 int main(int argc, const char *argv[]){
6 ucontext_t context;
7
8 getcontext(&context);
9 puts("Hello world");
10 //sleep(1);
(gdb) break 9
Breakpoint 1 at 0x4005bb: file test.c, line 9.
(gdb) run
Starting program: /home/dtarcatu/workspace/ctest/test
Breakpoint 1, main (argc=1, argv=0x7fffffffe008) at test.c:9
9 puts("Hello world");
(gdb) print $rbp
$1 = (void *) 0x7fffffffdf20
(gdb) print $rsp
$2 = (void *) 0x7fffffffdb60
(gdb) c
Continuing.
Hello world
Breakpoint 1, main (argc=1, argv=0x7fffffffe008) at test.c:9
9 puts("Hello world");
(gdb) print $rbp
$3 = (void *) 0x7fffffffdf20
(gdb) print $rsp
$4 = (void *) 0x7fffffffdb60
(gdb) c
Continuing.
Hello world
Breakpoint 1, main (argc=1, argv=0x7fffffffe008) at test.c:9
9 puts("Hello world");
(gdb) print $rbp
$5 = (void *) 0x7fffffffdf20
(gdb) print $rsp
$6 = (void *) 0x7fffffffdb60
我不熟悉这些上下文处理函数,但似乎 setcontext
不会将新帧推送到堆栈,而是按原样恢复堆栈。所以你只会陷入无限循环 - 没有堆栈溢出......
关于c - setcontext() 中的 Stackoverflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26420429/