Когда я ответил на этот question, я написал:
Во-первых, важно отметить, что не только поведение пользовательской программы undefined, но и поведение компилятора undefined.
Но в комментарии было , поэтому я хочу задать здесь вопрос:
Если исходный код содержит Undefined Поведение, является ли это только поведение переведенного машинного кода undefined или поведение компилятора undefined тоже?
Стандарт определяет поведение абстрактной машины (1.9):
Семантические описания в этом международном стандарте определяют параметризованную недетерминированную абстрактную машина. В этом Международном стандарте нет требований к структуре соответствующих реализаций. В частности, им не нужно копировать или эмулировать структуру абстрактной машины. Скорее, соответствующие реализации требуется, чтобы эмулировать (только) наблюдаемое поведение абстрактной машины, как объяснено ниже.
Может быть, вопрос в том, что компилятор является частью этой машины, и если да, если этой части разрешено вести себя с помощью Undefined?
Более практическая версия этого вопроса будет:
Предположим, что компилятор сбой или не выдаст какой-либо вывод, когда он найдет UB на всех путях управления, например, в этой программе:
int main() {
complex_things_without_UB();
int x = 42;
x = x++; //UB here
return x;
}
но в противном случае он всегда будет создавать корректные двоичные файлы. Будет ли это все еще стандартным компилятором?