GCC: __attribute__((malloc))
Zitat aus GCC-Dokumentation (Hervorhebung von mir):
Den malloc Attribut wird verwendet, um dem compiler, dass eine Funktion kann
behandelt werden, als wenn jeder nicht-NULL-Zeiger gibt es nicht alle alias
andere Zeiger gültig, wenn die Funktion zurückgibt und, dass der Speicher hat
undefinierter Inhalt. Dies verbessert Häufig die Optimierung. Standard
Funktionen mit dieser Eigenschaft sindmalloc
undcalloc
.realloc
-wie
Funktionen haben diese Eigenschaft nicht haben, da der Speicher darauf hingewiesen, nicht
haben undefinierten Inhalt.
Ich habe den folgenden code:
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;
}
Nun bin ich ein bisschen verwirrt hier: obwohl ich nicht initialisieren, die data
Mitglied ich immer noch den alloc
und size
Felder auf die entsprechenden Werte. Kann ich immer noch überlegen, diesem segment zugeordnet werden von "undefined " Inhalt" und verwenden Sie die malloc Attribut?
- Ich denke, Sie verkennen die Bedeutung des Attributs. Zum Beispiel
calloc
gibt den Speicher mit genau definierten Inhalten. - da das Attribut explizit fest, der Inhalt ist undefiniert, und da
calloc
's Speicher ist sehr klar definiert, ich glaube ich muss das Missverständnis etwas zu... könnten Sie das bitte näher erläutern? - Ich denke, dass das Attribut für die Unterstützung bei aliasing-Analyse. Der compiler kann davon ausgehen, dass die zurückgegebenen Speicher nicht enthalten, zu sagen, der Zeiger auf ein vorhandenes Objekt.
- Nähte vernünftig. Ich denke, dass das Handbuch die Formulierung ist unglücklich gewählt.
- Wahrscheinlich eine gute Frage für einige gcc-Entwickler-Liste (zur Verbesserung des Dokuments)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es sicher zu markieren
buffer_new
Funktion mit__attribute__((malloc))
, da der block gibt es enthält keine Verweise.Den neuesten GCC-Dokumentation verdeutlicht die Bedeutung von
__attribute__((malloc))
: der block von einer Funktion zurückgegeben wird, so muss markiert werden, enthalten diese keine Zeiger auf andere Objekte. Die Absicht ist zu helfen, die compiler-Schätzung die Zeiger möglicherweise Punkt in einem Objekt: das Attribut weist GCC-Sie brauchen sich keine sorgen, dass das Objekt Ihrer Funktion gibt möglicherweise enthalten Zeiger auf etwas anderes, das es tracking.Hier ist ein link von einem code-review in den Ubuntu-forum-und ja, die Dokumentation muss verbessert werden
https://bugs.launchpad.net/ubuntu/+source/gcc-4.7/+bug/1123588