在C中包装alloca函数

时间:2014-05-31 00:33:15

标签: c memory gnu alloca

是否可以将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

alloca()函数在堆栈中分配空间的大小字节        调用者

的框架

那么,上述方法是否安全?

2 个答案:

答案 0 :(得分:3)

为我的问题找到了解决办法:)

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);
}

答案 1 :(得分:0)

我怀疑你可以,但更重要的是,你为什么要这样做? 这是一个严重的错误!

你要在堆栈上分配一些内容,以便在堆栈中销毁它,并返回相同的指令!在您有机会使用之前,它几乎肯定会在堆栈上被覆盖。