Zitieren von GCC-Dokumentation (Hervorhebung von mir):
Das Attribut malloc wird verwendet, um dem Compiler zu sagen, dass eine Funktion dies kann behandelt werden, als ob ein beliebiger Nicht-NULL-Zeiger, der zurückgegeben wird, keinen Aliasnamen haben kann anderer Zeiger ist gültig, wenn die Funktion zurückgibt und der Speicher vorhanden ist nicht definierter Inhalt . Dies verbessert oft die Optimierung. Standard Funktionen mit dieser Eigenschaft sind
malloc
undcalloc
.realloc
-like Funktionen haben diese Eigenschaft nicht, da der Speicher, auf den verwiesen wird, nicht aufweist habe undefinierten Inhalt.
Ich habe den folgenden Code:
%Vor% Nun bin ich ein bisschen verwirrt: Obwohl ich das data
-Member nicht initialisiert habe, setze ich die Felder alloc
und size
immer noch auf ihre jeweiligen Werte. Kann ich dieses zugewiesene Segment immer noch als "nicht definierten Inhalt" betrachten und das Attribut malloc verwenden?
Es ist sicher, Ihre Funktion buffer_new
mit __attribute__((malloc))
zu markieren, weil der zurückgegebene Block keine Zeiger enthält.
Die neueste GCC-Dokumentation verdeutlicht die Bedeutung von __attribute__((malloc))
: Der von einer so markierten Funktion zurückgegebene Block darf keine Zeiger auf andere Objekte enthalten. Die Absicht ist, dem Compiler zu helfen, zu schätzen, welche Zeiger möglicherweise auf das gleiche Objekt zeigen: Das Attribut teilt GCC mit, dass es keine Angst haben muss, dass das Objekt, das Ihre Funktion zurückgibt, Zeiger auf etwas anderes, das es verfolgt, enthält.
Tags und Links c attributes gcc malloc