Grundlagen der Programmiersprache C

Welche Aussage beschreibt das undefinierte Verhalten im Sinne des C-Standards richtig?

  1. AEin Verhalten, für das der Standard nichts festlegt; der Compiler darf beim Optimieren annehmen, dass es nicht auftritt, und das Ergebnis kann unerwartet sein
  2. BEin Verhalten, dessen Ergebnis jede Implementierung festlegen und dokumentieren muss
  3. CEin Verhalten, das zur Laufzeit stets erkannt wird und das Programm mit einer Fehlermeldung anhält
Antwort und Erläuterung anzeigen

Antwort: A. Ein Verhalten, für das der Standard nichts festlegt; der Compiler darf beim Optimieren annehmen, dass es nicht auftritt, und das Ergebnis kann unerwartet sein

Undefiniertes Verhalten ist ein Verhalten, für das der Standard keinerlei Anforderungen stellt, etwa beim Überlauf vorzeichenbehafteter Ganzzahlen, bei Zugriffen auf ein Array außerhalb seiner Grenzen, bei der Dereferenzierung eines NULL-Zeigers oder bei Zugriffen nach der Freigabe. Mitunter funktioniert es zufällig wie erwartet, doch weil der Compiler beim Optimieren annehmen darf, dass es „in einem korrekten Programm nicht auftritt“, kann sich das Ergebnis schon durch andere Optimierungseinstellungen oder eine andere Compilerversion ändern. Was dagegen die Implementierung festlegen und dokumentieren muss, wie die Größe von int oder ob char ein Vorzeichen hat, heißt implementierungsdefiniertes Verhalten. Mit -fsanitize=undefined lassen sich bei gcc und clang manche Fälle von undefiniertem Verhalten zur Laufzeit erkennen.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Grundlagen der Programmiersprache C

  1. int und unsigned int haben 32 Bit. Was davon ist nach dem C-Standard undefiniertes Verhalten?
  2. Wird die obige Funktion mit gcc und aktivierter Optimierung kompiliert, kann die Prüfung if (p == NULL) entfernt werden. Was ist der Grund dafür?
  3. Was legt der C-Standard über die Größe des Typs int fest?
  4. In Embedded-Programmen wird eine Variable für den Wert eines 32-Bit-Peripherieregisters oft nicht als unsigned int, sondern als uint32_t aus stdint.h deklariert. Was ist der Hauptgrund dafür?
  5. Welche Ausgabe erzeugt der obige Code mit einer Division zweier Ganzzahlen bei der Ausführung?