Цитата из Документация 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?
