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, что не нужно беспокоиться о том, что объект, возвращаемый вашей функцией, может включать указатели на что-то еще, что он отслеживает.