GCC文档中的报价(强调矿):
malloc属性用于告诉编译器函数可能被视为它返回的任何非NULL指针都不能别名当函数返回并且内存具有未定义的内容。这通常会改进优化。标准具有此属性的函数包括CCD_ 1和CCD_。类
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;
}
现在我有点困惑:虽然我没有初始化data
成员,但我仍然将alloc
和size
字段设置为各自的值。我还能认为这个分配的片段是"未定义的内容",并使用malloc属性吗?
用__attribute__((malloc))
标记buffer_new
函数是安全的,因为它返回的块不包含指针。
最新的GCC文档阐明了__attribute__((malloc))
的含义:如此标记的函数返回的块不得包含指向其他对象的任何指针。其目的是帮助编译器估计哪些指针可能指向同一对象:属性告诉GCC,它不必担心函数返回的对象可能包括指向它正在跟踪的其他对象的指针。
这是Ubuntu论坛中代码审查的链接,是的,文档需要改进https://bugs.launchpad.net/ubuntu/+source/gcc-4.7/+bug/1123588