Когда я answered это question, я писал:Является ли поведение компилятора неопределенным, с неопределенным поведением?
Во-первых, важно отметить, что это не только поведение программы пользователя, которая является неопределенным, это поведение компилятора, который не определен.
Но был disagreement in a comment, поэтому я хочу, чтобы задать вопрос здесь:
Если исходный код содержит неопределенное поведение, это только поведение переведенного машинного кода, который не определен, или является поведение компилятора не определено?
Стандарт определяет поведение абстрактной машины (1.9):
семантические описания в настоящем стандарте определить параметризованный недетерминированную абстрактные машины. В этом Международном стандарте нет требований к структуре соответствующих реализаций. В частности, им не нужно копировать или эмулировать структуру абстрактной машины. Скорее, для соответствия (только) наблюдаемого поведения абстрактной машины, как объяснено, , необходимо выполнить соответствующие реализации .
Возможно, вопрос заключается в том, является ли компилятор частью этого аппарата, и если да, то если этой части разрешено вести себя неопределенным способом?
Более практичный вариант этого вопроса будет:
Предположим, компилятор врежется или не выводит, когда он находит UB на всех путях управления, как в этой программе:
int main() {
complex_things_without_UB();
int x = 42;
x = x++; //UB here
return x;
}
но в противном случае он всегда будет создавать корректные двоичные файлы. Будет ли это все еще стандартным компилятором?
Стандарт на самом деле не имеет понятия «компилятор», AFAIK. –
Не последнее ли последнее подразумевает? Если у компилятора есть неопределенное поведение, полученный машинный код (и, следовательно, пользовательская программа) также не определен, верно? – JorenHeit
@OliverCharlesworth Я согласен, но что это значит? – alain