GCC: __attribute __ ((malloc))

Cytat zDokumentacja GCC (podkreślenie moje):

Themalloc atrybut jest używany do informowania kompilatora, że ​​funkcja może być traktowana tak, jakby dowolny zwracany przez nią wskaźnik inny niż NULL nie mógł aliasować żadnego innego wskaźnika ważnego, gdy funkcja zwracai że pamięć ma niezdefiniowaną zawartość. To często poprawia optymalizację. Standardowe funkcje z tą właściwością obejmująmalloc icalloc. reallocpodobne funkcje nie mają tej właściwości, ponieważ pamięć wskazywała, że ​​nie ma niezdefiniowanej zawartości.

Mam następujący kod:

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;
}

Teraz trochę mnie to zastanawia: chociaż nie zainicjowałemdata członek, nadal ustawiamalloc isize pola do odpowiednich wartości. Czy nadal mogę uznać ten przydzielony segment za „niezdefiniowany” i użyćmalloc atrybut?

questionAnswers(2)

yourAnswerToTheQuestion