Undefiniertes Verhalten in C (Undefiniertes Verhalten in C), Lektion, Seite 724248
https://www.purl.org/stefan_ram/pub/undefiniert_c (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C-Kurs

Undefiniertes Verhalten in C 

Wenn das Verhalten einer Auswertung undefiniert  ist, dann ist es einer C -Implementation freigestellt, wie sie sich verhält, wenn ein Programm solch eine Auswertung von ihr verlangt. Sie muß hier auch nicht dokumentieren, wie sie sich verhält, und könnte sich auch jedes Mal anders verhalten.

Es ist höchst unerwünscht, daß eine C -Implementation einfach irgend etwas  tut. Deswegen muß man es als einen Fehler des Programmierers ansehen, wenn sein Programm zu undefiniertem Verhalten führt.

Wenn ein Programm undefiniertes Verhalten verlangt, kann dies nicht immer schon beim Übersetzen durch eine Fehlermeldung angezeigt werden, da eine C -Implementation nicht immer erkennen kann, ob ein Programm undefiniertes Verhalten verlangt. Beispielsweise könnte ein Programm undefiniertes Verhalten nur bei einer bestimmten Eingabe zeigen, und die C -Implementation kann beim Übersetzen nicht wissen, ob jene Eingabe erfolgen wird, wenn das Programm läuft.

Man kann undefiniertes Verhalten nicht durch Ausprobieren eines Programmes sehen, denn undefiniertes Verhalten kann auch darin bestehen, daß ein Programm genau das tut, was man erwartet. Beispielsweise hat die Auswertung des Ausdrucks »1/0« undefiniertes Verhalten. Ein Implementation darf daher dafür den Wert »[0]« festlegen. Ein Programmierer, der das beobachtet könnte nun glauben, daß der Wert von »1/0« in C  allgemein als »[0]« festgelegt sei. Tatsächlich hat die Auswertung jenes Ausdrucks aber undefiniertes Verhalten. Das bedeutet, daß eine andere Auswertung desselben Ausdrucks einen anderen Wert ergeben könnte.

Dies zeigt, daß man allgemein die Regeln von C  nicht durch Ausprobieren mit einer Implementation kennenlernen kann, denn bei allem, was man beobachtet, weiß man nicht, ob dies wirklich von der Programmiersprache so festgelegt wurde oder nur eine bestimmte Realisierung von implementationsdefiniertem, unspezifiziertem oder undefiniertem Verhalten darstellt! Um die Regeln zu lernen, ist vielmehr die Lektüre der Spezifikation der Sprache (der C -Norm ISO/IEC 9899 ) unabdingbar!

Bei einem Test wurde die Ausführung des folgenden Programms abgebrochen.

main.c

#include <stdio.h>

int main( void )
{ printf
( "%d\n", 1/0 ); }

Protokoll
(Programmabbruch)

Eine andere C -Implementation, die bei Ausführung des obigen Programms »0« oder »27« ausgibt wäre aber genauso normgerecht. Es wäre auch normgerecht, wenn die C -Implementation schon während der Übersetzung eine Fehlermeldung ausgibt. Kurs gesagt, wenn der Programmierer den Fehler begangen hat, von einer C -Implementation eine Division durch »[0]« zu verlangen, so darf die Implementation machen was sie will.

N2176 6.5 Expressions, Absatz 5 (Übersetzung und Original)
Tritt bei der Auswertung eines Ausdrucks eine Ausnahmesituation auf (d.h. ist das Ergebnis nicht mathematisch definiert oder nicht im Bereich der darstellbaren Werte für seinen Typ), ist das Verhalten undefiniert.
If an exceptional condition occurs during the evaluation of an expression (that is, if the result is not mathematically defined or not in the range of representable values for its type), the behavior is undefined.
N2176 6.5.5 Multiplicative operators, Absatz 5 (Übersetzung und Original)
Das Ergebnis des /-Operators ist der Quotient aus der Division des ersten Operanden durch den zweiten; das Ergebnis des %-Operators ist der Rest. Für beide Operationen gilt: Wenn der Wert des zweiten Operanden Null ist, dann ist das Verhalten undefiniert.
The result of the / operator is the quotient from the division of the first operand by the second; the result of the % operator is the remainder. In both operations, if the value of the second operand is zero, the behavior is undefined.

Ein portables Programm wird im Standard „streng konform“ genannt. (Eine minimale Implementierungsgrenze ist eine Zusicherung über bestimmten Minimalanforderungen, die jede Implementation erfüllen muß.)

N2176 4. Conformance, Absatz 5 (Übersetzung und Original)
Ein streng konformes Programm darf nur die Fähigkeiten der in dieser Internationalen Norm spezifizierten Sprache und Bibliothek verwenden. Es darf keine Ausgabe erzeugen, die von einem implementationsdefinierten, unspezifizierten oder undefinierten Verhalten abhängt, und darf keine minimale Implementierungsgrenze überschreiten.
A strictly conforming program shall use only those features of the language and library specified in this International Standard. It shall not produce output dependent on any unspecified, undefined, or implementation-defined behavior, and shall not exceed any minimum implementation limit.
James Kuyper  (Übersetzung und Original)
Wenn Sie C -Code mit undefiniertem Verhalten schreiben, sagen Sie der Implementierung, daß es Ihnen egal ist, was die Ergebnisse sind. Ich empfehle, das nicht zu sagen, es sei denn, Sie meinen es wirklich so.
When you write C code with undefined behavior, you're telling the implementation that you don't care what the results are. I recommend not telling it that, unless you really mean it.
From: James Kuyper
Newsgroups: comp.lang.c
Subject: Re: C wish list
Date: Thu, 21 Mar 2019 15:18:09 -0400
Message-ID: <q70o1j$op8$1@dont-email.me>
Kuyper kaɪpɚ (Aussprache)
Keith Thompson   (Übersetzung und Original)
Es ist nicht so, daß optimierende C-Compiler undefiniertes Verhalten erkennen und dann beschließen, albernen Code zu generieren. Sie gehen davon aus, daß der eingegebene Quellcode definiertes Verhalten aufweist, und erzeugen dann Maschinencode, der auf dieser Annahme basiert.
Optimizing C compilers do not detect undefined behavior and then decide to generate silly code. They *assume* that the input source code has defined behavior, and then generate machine code based on that assumption.
From: Keith Thompson
Newsgroups: comp.lang.c
Subject: Re: C wish list
Date: Thu, 21 Mar 2019 12:55:40 -0700
Message-ID: <ln7ecsgfyb.fsf@kst-u.example.com>

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 stefanram724248 stefan_ram:724248 Undefiniertes Verhalten in C Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd724248, slrprddef724248, 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/undefiniert_c