返回alloca指针
此代码是否返回对堆栈上分配的变量的无效引用?或者什么:返回alloca指针,c,pointers,memory-management,stack,alloca,C,Pointers,Memory Management,Stack,Alloca,此代码是否返回对堆栈上分配的变量的无效引用?或者什么: void *f(size_t sz) { return alloca(sz); } 或者它是由alloca实现/编译器支持处理的特殊情况,如f(alloca(size),alloca(size))将是?alloca在f的堆栈框架中分配空间。一旦函数返回,您就无法使用它做任何有用的事情(它不再是“保留的”) 函数的作用是:在堆栈帧中分配大小字节的空间 打电话的人的名字。当 调用alloca()的函数返回其调用者 根据: 函数的all
void *f(size_t sz) {
return alloca(sz);
}
或者它是由alloca实现/编译器支持处理的特殊情况,如
f(alloca(size),alloca(size))
将是?alloca
在f
的堆栈框架中分配空间。一旦函数返回,您就无法使用它做任何有用的事情(它不再是“保留的”)
函数的作用是:在堆栈帧中分配大小字节的空间
打电话的人的名字。当
调用alloca()的函数返回其调用者
根据:
函数的alloca()
在
并返回指向已分配块的指针。这是暂时的
当函数alloca()
这就是所谓的回报
这意味着,试图访问
f()
返回的内存将导致未定义的行为,因为当f()
返回时,内存将被释放 是,代码返回无效指针<代码>alloca调用不能包装到函数中。如果您需要包装alloca
,则只能使用宏包装器。正如其他人所说,它将被释放,我不知道如何更改行为。如果您查看amd-64上alloca的编译方式:
pushq %rbp
movq %rsp, %rbp
subq $144, %rsp
movq %rsp, %rax
addq $15, %rax
shrq $4, %rax
salq $4, %rax
leave
ret
你看
1) Alloca实际上不是一个函数调用(因为,正如您所说,它必须以不同的方式处理堆栈!)
2) 当rbp
覆盖rsp
那么,您是否可以了解您所询问的行为(不编写汇编)?这是一个棘手的问题,我不知道,但看起来可能不是。我自己从未使用过alloca,但我在这里读到了关于“内联问题”的内容: 答案“最令人难忘的错误之一……”非常有趣 因此,当函数超出范围时,内存肯定会被释放,这是不正确的。这是:
void *f() {
char* pc4 = alloca(4);
...
}
正是这样:
void *f() {
char pc4[4];
...
}
在第二种情况下,您既不能在函数外返回/使用pc4,也不能在第一种情况下返回/使用pc4 稍微撇开你的问题不谈,但是
alloca
可能总是返回一个无效的指针,你对此无能为力。使用alloca
的代码几乎肯定是错误的代码,并且可能存在严重的漏洞。对于R:“使用alloca的代码几乎肯定是错误的代码”是一个类似于“任何刀子的使用都是错误的”或类似的语句。alloca是一个强大的功能,当它被有目的地、有反应地使用时。