在C中封装alloca函数
是否有可能将C函数alloca
包装为“另一个”? (当然只有宏)
就像是:
#define my_alloca(size) ({ void *ret = alloca(size); my_function(ret); ret;})
我对此不太确定6.1 Statements and Declarations in Expressions
中的扩展6.1 Statements and Declarations in Expressions
创建一个新的堆栈框架? (它看起来很像是因为大括号)
编辑:
它做了一些测试:
#define printStackFrameAddr(_fnc)
printf("%-20s: %p n", _fnc, __builtin_frame_address(0))
void _my_init(void *mem)
{
}
void *notSafeAlloca(size_t num)
{
void *mem;
printStackFrameAddr("notSafeAlloca");
mem = alloca(num);
_my_init(mem);
return mem;
}
#define safeAlloca(_num)
({
void *ret = alloca(_num);
_my_init(ret);
printStackFrameAddr("safeAlloca");
ret;})
int main(int argc, const char * argv[])
{
printStackFrameAddr("main");
{ /* <- creates no new stack frame ? */
int *array = notSafeAlloca(sizeof(* array) * 4);
printStackFrameAddr("main");
printf("t%-20s: %pn", "array", array);
}
{ /* <- creates no new stack frame ? */
int *array = safeAlloca(sizeof(* array) * 4);
printStackFrameAddr("main");
printf("t%-20s: %pn", "array", array);
}
return 0;
}
输出:
main : 0x7fff5fbff8d0
notSafeAlloca : 0x7fff5fbff860
main : 0x7fff5fbff8d0
array : 0x7fff5fbff820
safeAlloca : 0x7fff5fbff8d0
main : 0x7fff5fbff8d0
array : 0x7fff5fbff888
alloca()函数在调用者的堆栈帧中分配空间的大小字节
那么,这是上面的方法安全吗?
得到了我的问题的解决方案:)
void *_my_alloca(void *memory)
{
// init memory & stuff
return memory;
}
#define my_alloca(_size) _my_alloca(alloca(_size))
int main(int argc, const char **argv)
{
int *array = my_alloca(sizeof(* array) * 4);
}
我怀疑你可以,但更重要的是,你为什么想要? 这是一个严重的错误!
你将在堆栈上分配一些东西,使它在堆栈上销毁与你返回的指令相同的指令! 在您有机会使用它之前,它几乎肯定会被覆盖在堆栈上。
链接地址: http://www.djcxy.com/p/84327.html