Рассмотрим следующее утверждение:
*((char*)NULL) = 0; //undefined behavior
Он явно вызывает поведение undefined. Означает ли существование такого утверждения в данной программе, что вся программа undefined или что поведение только становится undefined после того, как поток управления попадает в это утверждение?
Будет ли следующая программа хорошо определена, если пользователь никогда не войдет в число 3
?
while (true) {
int num = ReadNumberFromConsole();
if (num == 3)
*((char*)NULL) = 0; //undefined behavior
}
Или это полностью undefined поведение независимо от того, что пользователь вводит?
Кроме того, может ли компилятор предположить, что поведение undefined никогда не будет выполняться во время выполнения? Это позволило бы рассуждать назад во времени:
int num = ReadNumberFromConsole();
if (num == 3) {
PrintToConsole(num);
*((char*)NULL) = 0; //undefined behavior
}
Здесь компилятор может сообразить, что в случае num == 3
мы всегда будем вызывать поведение undefined. Поэтому этот случай должен быть невозможным, и его не нужно печатать. Весь оператор if
может быть оптимизирован. Является ли такое обратное рассуждение допустимым в соответствии со стандартом?