GCC:__ attribute __((malloc))

时间:2013-08-28 10:31:21

标签: c gcc attributes malloc

引自GCC documentation(强调我的):

  

malloc 属性用于告诉编译器函数可以   被视为它返回的任何非NULL指针都不能别名   当函数返回并且内存有时,其他指针有效   未定义的内容。这通常会改善优化。标准   具有此属性的函数包括malloccallocrealloc - 像   函数没有这个属性,因为指向的内存没有   有未定义的内容。

我有以下代码:

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

现在我有点困惑:尽管我没有初始化data成员,但我仍然将allocsize字段设置为各自的值。我仍然可以将此分配的段视为“未定义的内容”并使用 malloc 属性吗?

2 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:1)

以下是Ubuntu论坛中代码审核的链接,是的,需要对文档进行改进 https://bugs.launchpad.net/ubuntu/+source/gcc-4.7/+bug/1123588