GCC:__ attribute __((malloc))

pet*_*zik 9 c malloc attributes gcc

引用海湾合作委员会文件(强调我的):

所述的malloc属性用来告诉仿佛任何非空指针返回不能别名任何其它有效指针的功能可被处理编译时该函数返回与该存储器有未定义的内容.这通常会改善优化.具有此属性的标准函数包括malloccalloc.realloc类似函数没有此属性,因为指向的内存没有未定义的内容.

我有以下代码:

struct buffer {
    size_t alloc;  // Allocated memory in bytes
    size_t size;   // Actual data size in bytes
    char data[];   // Flexible array member
};


#define ARRAY_SIZE <initial_value>

buffer *buffer_new(void) __attribute__((malloc))
{
    struct buffer *ret;

    ret = malloc(sizeof(struct buffer) + ARRAY_SIZE);
    if (!ret)
        fatal(E_OUT_OF_MEMORY);

    ret->alloc = ARRAY_SIZE;
    ret->size = 0;

    return ret;
}
Run Code Online (Sandbox Code Playgroud)

现在,我在这里有点纳闷:虽然我没有初始化的data成员,我仍然设置allocsize字段以它们各自的值.我仍然可以将此分配的段视为"未定义的内容"并使用malloc属性吗?

Jim*_*ndy 14

标记buffer_new函数是安全的__attribute__((malloc)),因为它返回的块不包含指针.

最新的GCC文档阐明了以下含义__attribute__((malloc)):由如此标记的函数返回的块不得包含任何指向其他对象的指针.目的是帮助编译器估计哪些指针可能指向同一个对象:该属性告诉GCC它不必担心你的函数返回的对象可能包含指向它正在跟踪的其他东西的指针.