@Krishty
Der Compiler ist deswegen nicht standardkonform?
Undefined Behaviour heißt doch, dass vom Standard her undefiniert ist, was passiert. Das schließt aber doch nicht aus, dass auf einer bestimmten Plattform in einer Situation immer das selbe Verhalten eintritt.
@Alexander Kornrumpf
Der Kern des Problems mit Undefined Behavour ist nicht, dass irgendein Compiler dann Code einsetzt, der anfängt die Festplatte zu formatieren oder sowas. Die Aussage steht nur stellvertretend dafür, dass tatsächlich undefiniert ist was dann passiert und mit entsprechender Wahrscheinlichkeit wirklich alles passieren kann. Die Sache mit der Formatierung ist normalerweise natürlich ausreichend unwahrscheinlich. Man denke doch aber mal an den Quellcode von dem Programm "format", das dafür geschrieben wurde die Festplatte zu formatieren. Mit Undefined Behaviour wäre es realistisch denkbar, dass die Ausführung vom Programmierer unbeabsichtigt von irgendeiner Stelle irgendwie in die Formatierungsroutine springen kann.
Im Prinzip ist auftretender Undefined Behaviour einfach ein Bug. Genau wie bei einem Bug wird Verhalten ausgelöst das vom Programmierer mehr oder weniger nicht erwünscht ist. Auftretender Undefined Behaviour ist also per Definition "böse". Bounds Checks sind an sich kein Problem. Ein Problem wäre aber, wenn der Bounds Check zu Undefined Behaviour führt, der zum Beispiel dafür sorgt, dass der Compiler (oder ein anderer) den Bounds Check komplett wegoptimiert so das gar nicht mehr gecheckt wird. (das hat schon ganz konkret in der Praxis für Probleme gesorgt)
Um dem Problem vorzubeugen eignet, bietet zum Beispiel Clang Sanitizer an, um das Problem aufspühren zu können (
Undefined Behavior,
Address, etc.). Sehr lesenswert ist auch noch das:
What Every C Programmer Should Know About Undefined Behavior
Ich bin prinzipiell aber auch dafür, dass man die Menge an Undefined Behaviour drastisch einschränkt. Kristhy hat schon einige Stellen von leicht zu behebenden Fällen genannt. Andere Fälle wie zum Beispiel Integer Overflow könnt man von Undefined Behaviour zu Unspecified Value umwandeln. Ich glaube nicht, dass dadurch viele nützliche Optimierungen betroffen wären.