GCC:__ attribute __((malloc))
引用海湾合作委员会文件 (强调我的):
malloc属性用于告诉编译器可以将函数视为其返回的任何非NULL指针在函数返回时不能将任何其他指针作为别名,并且内存具有未定义的内容 。 这通常会改善优化。 具有此属性的标准函数包括
malloc
和calloc
。 类似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 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