Grundlagen der Programmiersprache C
Welche Aussage beschreibt das undefinierte Verhalten im Sinne des C-Standards richtig?
- 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
- BEin Verhalten, dessen Ergebnis jede Implementierung festlegen und dokumentieren muss
- 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.
Weiter: 9 weitere Fragen zu Grundlagen der Programmiersprache C