可以将C函数alloca包装成“另一个”吗?(当然只有宏)
类似于:
#define my_alloca(size) \
({ \
void *ret = alloca(size); \
my_function(ret); \
ret;})我不太确定,扩展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: %p\n", "array", array);
}
{ /* <- creates no new stack frame ? */
int *array = safeAlloca(sizeof(* array) * 4);
printStackFrameAddr("main");
printf("\t%-20s: %p\n", "array", array);
}
return 0;
}输出:
main : 0x7fff5fbff8d0
notSafeAlloca : 0x7fff5fbff860
main : 0x7fff5fbff8d0
array : 0x7fff5fbff820
safeAlloca : 0x7fff5fbff8d0
main : 0x7fff5fbff8d0
array : 0x7fff5fbff888函数在调用方的堆栈框架中分配空间大小字节。
那么,这一方法安全吗?
发布于 2014-05-31 01:17:40
我的问题有了一个解决办法:)
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);
}发布于 2014-05-31 00:37:28
我怀疑你能做到,但更重要的是,你为什么要这么做?这是个严重的错误!
您将在堆栈上分配一些东西,以便在堆栈上销毁它,与返回它的指令完全相同!在您有机会使用它之前,它几乎肯定会被覆盖在堆栈上。
https://stackoverflow.com/questions/23965254
复制相似问题