返回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是一个强大的功能,当它被有目的地、有反应地使用时。