C w / Blocks: Stack-basierte Blöcke gehen aus dem Geltungsbereich aus

8

In einer der Header-Dateien von Apple für libdispatch , queue.h erscheint die folgende Warnung:

%Vor%

Versuchen Sie es mir, ich kann mir keinen Testfall vorstellen, der diesen Fehler veranschaulicht. Ich kann Blöcke erstellen, die auf dem Stapel instanziiert werden, aber sie scheinen (scheinen) immer an eindeutigen Adressen auf dem Stapel zu erscheinen, selbst wenn sie nicht in Bezug aufeinander liegen.

Ich stelle mir vor, dass die Antwort einfach ist, aber es entgeht mir. Kann jemand die Lücken in meinem (begrenzten) Verständnis füllen?

BEARBEITEN : Ich habe diese Antwort gesehen , aber ich verstehe nicht ganz, wie diese Instanz in mein Beispiel übersetzt werden kann. Kann mir jemand ein Beispiel mit if constructs zeigen?

    
Sedate Alien 16.09.2011, 01:36
quelle

1 Antwort

5

Um einen Stapelverschluss innerhalb einer Funktion zu stürzen:

  • Sie müssen sicherstellen, dass der Verschluss tatsächlich ein Stapelverschluss ist. Ab Apple Clang 2.1 wird ein Abschluss, der keine Variablen in seinem aktuellen Kontext (wie dem in der Warteschlange.h) referenziert, als globaler Abschluss realisiert. Dies ist ein Implementierungsdetail, das zwischen verschiedenen Compiler / Compiler-Versionen variieren kann;

  • Der Compiler muss Code ausgeben, der den Stapelbereich, in dem die Schließung einmal gelebt hat, effektiv wiederverwendet / neu schreibt. Ansonsten befindet sich jedes Objekt innerhalb dieser Funktion an einer anderen Adresse im Funktionsstapelrahmen, was bedeutet, dass Sie innerhalb dieser Funktion keinen Absturz bekommen. Es scheint, dass Apple Clang 2.1 Stapelspeicheradressen nicht wiederverwenden. GCC 4.6 kann sie wiederverwenden, unterstützt aber keine Schließungen.

Da Apple Clang 2.1 keine Adressen in einem Funktionsstapfrahmen wiederverwendet und GCC 4.6 keine Closures unterstützt, kann ich aus dem, was ich sagen kann, dieses spezielle Beispiel nicht machen - innerhalb einer Funktion einen Stapel außerhalb des Bereichs aufrufen Schließung - Absturz.

Ich schrieb einen ausführlicheren Text dazu auf mein Blog .

    
user557219 22.09.2011, 18:07
quelle