C++ 考虑makecontext(),uc_stack.ss_大小适合做什么?

C++ 考虑makecontext(),uc_stack.ss_大小适合做什么?,c++,ucontext,C++,Ucontext,在调用makecontext之前,为什么需要设置堆栈大小ss_size 我刚刚为makecontext/swapcontext代码片段编写了一个单元测试用例,但由于SIGSEGV而失败。发生的情况是堆栈大小太小,不相关的内存(碰巧是一些唯一的指针)损坏并报告segfault。所以segfault在这些不相关的指针上,我可以有一些字符串,然后内存损坏就不会被注意到了 我本以为当堆栈大小ss_size不够时,SIGSEGV会立即升高,但是 考虑到上面描述的内存损坏,我得出结论,这里不可能从SIGSE

在调用
makecontext
之前,为什么需要设置堆栈大小
ss_size

我刚刚为
makecontext/swapcontext
代码片段编写了一个单元测试用例,但由于
SIGSEGV
而失败。发生的情况是堆栈大小太小,不相关的内存(碰巧是一些唯一的指针)损坏并报告segfault。所以segfault在这些不相关的指针上,我可以有一些字符串,然后内存损坏就不会被注意到了

我本以为当堆栈大小
ss_size
不够时,
SIGSEGV
会立即升高,但是 考虑到上面描述的内存损坏,我得出结论,这里不可能从
SIGSEGV
恢复。这让我回到问题上来,为什么我们首先需要设置堆栈大小,而不是用来表示溢出?它是用来干什么的


编辑:

好吧,一切都是关于你的。这些函数仍然被用于绿色线程、协同程序等。对于这些任务,没有真正的替代,考虑到这些任务(我认为)也不是C++。 中定义的
ucontext\u t
中的
uc\u堆栈
需要中定义的
ss\u大小

下面是显示内存损坏的示例,通过“绘制”内存,如上所述

#包括
#包括
#包括
#包括
#包括
#包括
ucontext_t调用者,被调用者;
无效cb(无效){
//用2
char-tmp[7000];
标准:memset(tmp,27000);
//注意堆栈大小指定为6k字节大小
//这是不允许的。
//此外,这里甚至没有发出任何信号
//当这个调用堆栈超过ss_大小时,我期望提升SIGSEGV
//这让ss_码没用了不是吗?
}
int main(){
//
std::memset(&caller,0,sizeof(caller));
std::memset(&callee,0,sizeof(callee));
//创建堆栈并绘制0
std::unique_ptr堆栈(新std::byte[10000]());
std::memset(stack.get(),010000);//绘制堆栈0
//编造上下文
//注释[20008000]指定的堆栈
//这意味着[02000]和[800010000]不应被触碰
if(getcontext(&callee)==-1){std::cout
callee.uc_stack.ss_size=6000;//这条线有什么用,它在保护什么

这一行设置了堆栈大小(如您所读)。从读取
ss_size
可以确定堆栈的末尾,即新上下文的glibc。因为某些机器上的堆栈“向数字较低的地址增长”(就像它在和上所做的那样)
makecontext
需要/想要将它的数据放在堆栈的末尾。因此它需要确定堆栈的末尾,这就是
ss_size
的用途

ss_size
设置为任何值并不意味着堆栈大小溢出将向进程发出操作系统信号,通知您的进程试图访问受限内存区域。
*context
的实现不是(也不应该)设计为使地址
ss_sp+ss_size(+1)
作为内核保护的内存,因此写入该地址将触发分段错误。这仍然是所有正常变量。与写入未知内存位置(例如溢出的数组)一样,无效地址可能恰好位于进程地址空间内,因此根据内核,进程将被删除在它的地址空间中写入,一切都很好。正如您在这里所做的那样,您的
cb
函数在
new std::byte[10000]
内存中写入,从内核的角度来看,这没有什么问题


您很可能可以分配
newstd::byte[6000]
并在valgrind或gdb或其他工具下运行您的进程以检查恶意写入。

什么是
ss_size
以及如何设置它?请显示代码。我看到它的用途了?为什么在使用systemV api时需要使用它?为什么还要使用这么旧的api?@KamilCuk我已经更新了这个问题。希望这能澄清问题。
//注意堆栈大小在大小中指定了6k字节//这是不允许的。
-发生SIGSEGV和期望发生SIGSEGV是不同的事情。如果在允许的内存外写入,则不能期望发生SIGSEGV,可能恰好在进程空间内有一个有效地址。SMH!在answ之后查看我的问题呃,在数字较低的地址绘制错误后,我自己最晚应该能够回答堆栈大小的需要。这提供了很大的洞察力。关于参数的小草图和注释是金色的。