Rozważmy następujący program:Czy gwarantowane UB może zostać odrzucone podczas kompilacji?
#include <stdio.h>
int main(void)
{
int x;
while (1 == scanf("%d", &x))
printf("%c\n", "hello"[x]);
}
Kompilator musi skompilować ten program z powodzeniem, ponieważ nie ma UB tak długo jak użytkownik nie wprowadzać żadnych numerów spoza zakresu 0
- 4
.
Jednak zgodnie z this thread UB może cofnąć się w czasie. Rozważmy teraz ten program:
int main(void)
{
printf("hello\n");
"hello"[6];
}
Wszelkie wywołania tego programu powoduje zachowanie niezdefiniowane, a ponieważ, które mogą podróży w czasie, cała zachowanie tego programu na każdym wywołaniu jest niezdefiniowany. Czy zatem kompilator może odrzucić program i nie wygenerować pliku wykonywalnego? (Można powiedzieć, że UB cofa się w czasie do etapu kompilacji!)
@Zaffy: '" cześć "[5]' to ''\ 0'',' "cześć" [6] 'jest poza związanym. – Jarod42
@ Jarod42 oh, tak, przepraszam :) – Zaffy
Niezawodne i dźwiękowe wykrywanie niezdefiniowanych zachowań jest problemem niemożliwym do rozwiązania lub nierozstrzygalnym .... –