GCC: __attribute __ ((malloc))
Цитата из Документация GCC (выделено мной):
Атрибут malloc используется, чтобы сообщить компилятору, что функция может обрабатываться так, как если бы какой-либо не-NULL-указатель, который он возвращает, не может другой указатель действителен, когда функция возвращает и что память имеет undefined содержание. Это часто улучшает оптимизацию. стандарт функции с этим свойством включают malloc
и calloc
. realloc
-как функции не имеют этого свойства, поскольку память, на которую указывает имеют undefined содержимое.
У меня есть следующий код:
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
в соответствующие значения. Могу ли я считать этот выделенный сегмент "undefined content" и использовать атрибут malloc?
Ответы
Ответ 1
Безопасно пометить вашу функцию buffer_new
__attribute__((malloc))
, потому что возвращаемый блок не содержит указателей.
В последней документации GCC разъясняется значение __attribute__((malloc))
: блок, возвращаемый функцией, отмеченной таким образом, не должен содержать указателей на другие объекты. Цель состоит в том, чтобы помочь компилятору оценить, какие указатели могут указывать на один и тот же объект: атрибут указывает GCC, что не нужно беспокоиться о том, что объект, возвращаемый вашей функцией, может включать указатели на что-то еще, что он отслеживает.
Ответ 2
Вот ссылка из обзора кода на форуме Ubuntu и да, документация должна быть улучшена
https://bugs.launchpad.net/ubuntu/+source/gcc-4.7/+bug/1123588