13

引用GCC 文档(强调我的):

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

我有以下代码:

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成员,但我仍然将allocandsize字段设置为各自的值。我仍然可以认为这个分配的段是“未定义的内容”并使用malloc属性吗?

4

2 回答 2

20

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

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

于 2015-03-19T05:33:56.030 回答
1

Here is a link from a code review in the Ubuntu forum and yes the documentation needs to be improved https://bugs.launchpad.net/ubuntu/+source/gcc-4.7/+bug/1123588

于 2013-09-02T19:35:49.837 回答