gpt4 book ai didi

c - setcontext() 中的 Stackoverflow

转载 作者:太空宇宙 更新时间:2023-11-04 07:13:57 25 4
gpt4 key购买 nike

下面是我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com