Undefinierte Zuweisungen in C [] (Undefinierte Zuweisungen in C), Lektion, Seite 723039
https://www.purl.org/stefan_ram/pub/undefinierte_zuweisungen_c (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram

Undefinierte Zuweisungen in C 

Undefiniertes Verhalten

C  erlaubt es Ausdrücke zu schreiben, welche Fehler enthalten können, die weder vom Compiler als Fehler gemeldet noch bei der Ausführung als Fehler erkennbar werden. Der Fehler kann in diesem Fall darin bestehen, daß die Ausführung eines Programmteils undefiniertes Verhalten hat. Dies bedeutet, daß C  nicht festlegt, was bei der Ausführung dieses Programmteils geschieht.

Es könnte passieren, daß die Ausführung solch eines Programmteils in einem bestimmten Fall genau das bewirkt, was der Programmierer damit beabsichtigt hat. Dennoch ist undefiniertes Verhalten auch in diesem Fall nicht akzeptabel, da nicht garantiert wird, daß dies immer  so sein wird. Spätestens bei einem Wechsel der C -Implementation oder der Ausführungsumgebung könnte es passieren, daß sich das undefinierte Verhalten dann doch als eine Störung bemerkbar macht. Deswegen sollte es stets vermieden werden, Programmteile mit undefiniertem Verhalten zu schreiben. Da C -Implementationen solche Programmteile aber nicht immer erkennen und dann melden können, ist die Vermeidung undefinierten Verhaltens schwierig.

Sequenzierung von Operationen

Wir sagen, daß zwei Operationen sequenziert seien, wenn C  für sie eine bestimmte zeitliche Reihenfolge festlegt.

Beispielsweise sind die beiden Schreiboperationen bei der Ausführung von

{ i = 3;
j = 4; }

sequenziert, während die Schreiboperationen bei der Auswertung von

( i = 3 )+( j = 4 )

nicht sequenziert sind. Die meisten Operatoroperationen in C  legen keine bestimmte Reihenfolge für die Auswertung ihrer Operanden fest. Hingegen ist die Reihenfolge der Ausführung von Anweisungen einer Verbundanweisung festgelegt.

Unsequenziertes Schreiben in dasselbe Objekt

Zwei Schreiboperationen auf dasselbe Objekt müssen sequenziert sein, sonst ist das Verhalten dieser Operationen undefiniert.

Die Zuweisung

i = ( i = i + 1 )+ 1

hat undefiniertes Verhalten, weil zwei Schreiboperationen auf »i« stattfindet, welche relativ zueinander nicht sequenziert sind.

Zwar legt C  fest, daß der Wert  der beiden Seiten einer Zuweisung ermittelt wird, bevor die Schreiboperation stattfindet (N1570 6.5.16p3), aber dadurch ist nicht gesagt, daß auch die Wirkungen  der beiden Seiten eintreten, bevor die Schreiboperation stattfindet. Daher ist die Wirkung der inneren Zuweisung nicht zur Wirkung der äußeren Zuweisung sequenziert und damit hat die Auswertung des ganzen Ausdrucks undefiniertes Verhalten  (N1570 6.5p2).

Unsequenziertes Schreiben und Lesen desselben Objekts

Eine Schreiboperationen und eine Leseoperation auf dasselbe Objekt müssen sequenziert sein, sonst ist das Verhalten dieser Operationen undefiniert.

Die Addition

i +( i = i + 1 )

enthält eine Schreiboperation auf »i« und zwei Leseoperationen auf »i«. Die Leseoperation zu dem ganz links stehenden »i« ist nicht zur Schreiboperation sequenziert, so daß die Auswertung des gesamten Ausdruck undefiniertes Verhalten  hat (N1570 6.5p2).

Definierte Zuweisungen

Die Zuweisung

i = i + 1

hat kein  undefiniertes Verhalten. Zwar enthält sie eine Schreiboperation und eine Leseoperation auf »i«, doch ist die Leseoperation nach N1570 6.5.16p3 vor der Schreiboperation sequenziert (die Ermittlung von Werten in den Operanden einer Zuweisung findet vor der Schreiboperation der Zuweisung statt).

Zitate*

N1570 6.5p2
If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.
N1570 6.5p2
(…) Except as specified later, side effects and value computations of subexpressions are unsequenced.
N1570 6.5.16 p 3
(…) The side effect of updating the stored value of the left operand is sequenced after the value computations of the left and right operands. The evaluations of the operands are unsequenced.

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723039 stefan_ram:723039 Undefinierte Zuweisungen in C Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723039, slrprddef723039, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/undefinierte_zuweisungen_c