Betrachten Sie dieses Programm:Kann garantierte UB zur Kompilierungszeit zurückgewiesen werden?
#include <stdio.h>
int main(void)
{
int x;
while (1 == scanf("%d", &x))
printf("%c\n", "hello"[x]);
}
Der Compiler dies erfolgreich kompilieren muss, weil das Programm keine UB hat, solange der Benutzer keine Zahlen außerhalb des Bereichs 0
eintritt - 4
.
Jedoch kann UB nach this thread zurück in der Zeit reisen. Jetzt dieses Programm betrachten:
int main(void)
{
printf("hello\n");
"hello"[6];
}
Jeder Aufruf dieses Programm führt zu undefiniertem Verhalten, und da die-Laufzeit kann das gesamte Verhalten des Programms auf jedem Aufruf ist nicht definiert. Kann der Compiler das Programm daher ablehnen und keine ausführbare Datei erzeugen? (Wir könnten sagen, dass die UB zurück in die Zeit der Kompilierung reist!)
@Zaffy: '" Hallo "[5]' ist '' 0'', '" Hallo "[6]' ist außerhalb des Rahmens. – Jarod42
@ Jarod42 oh, yeah, sorry :) – Zaffy
Zuverlässige und sichere Erkennung von undefiniertem Verhalten ist ein unausführbares oder unentscheidbares Problem .... –