首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C语言包装alloca函数

用C语言包装alloca函数
EN

Stack Overflow用户
提问于 2014-05-31 00:33:14
回答 2查看 297关注 0票数 1

可以将C函数alloca包装成“另一个”吗?(当然只有宏)

类似于:

代码语言:javascript
复制
#define my_alloca(size)                                      \
                             ({                               \
                                   void *ret = alloca(size);  \
                                   my_function(ret);          \
                             ret;})

我不太确定,扩展6.1 Statements and Declarations in Expressions是否创建了一个新的堆栈框架?(它看起来有点像,因为有花括号)

编辑:

它对它做了一些测试:

代码语言:javascript
复制
#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;
}

输出:

代码语言:javascript
复制
main                : 0x7fff5fbff8d0 
notSafeAlloca       : 0x7fff5fbff860 
main                : 0x7fff5fbff8d0 
        array               : 0x7fff5fbff820
safeAlloca          : 0x7fff5fbff8d0 
main                : 0x7fff5fbff8d0 
        array               : 0x7fff5fbff888

函数在调用方的堆栈框架中分配空间大小字节。

那么,这一方法安全吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-31 01:17:40

我的问题有了一个解决办法:)

代码语言:javascript
复制
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);
}
票数 3
EN

Stack Overflow用户

发布于 2014-05-31 00:37:28

我怀疑你能做到,但更重要的是,你为什么要这么做?这是个严重的错误!

您将在堆栈上分配一些东西,以便在堆栈上销毁它,与返回它的指令完全相同!在您有机会使用它之前,它几乎肯定会被覆盖在堆栈上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23965254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档