Разрешено ли компилятору C++ выдавать случайный код, когда он встречает конструкцию, которая классифицируется как неопределенное поведение?

Возможный дубликат:
Неопределенное, неопределенное и определяемое реализацией поведение

Я пытаюсь углубить свое понимание неопределенного поведения в C++. Предположим, что компилятор C++ намеренно обнаружит некоторые случаи неопределенного поведения - например, дважды изменив переменную между двумя точками последовательности:

x++ = 2;

Как только этот воображаемый компилятор надежно обнаружит такую ​​ситуацию, он скажет, что выпустил десять полностью случайных машинных инструкций в полученный машинный код.

В соответствии со стандартом C++, где бы то ни было классифицировано как UB, нет никаких требований относительно того, что происходит. Будет ли описанный мнимый компилятор соответствовать стандарту C++?

4 ответа

Решение

Да. Стандарт не предъявляет никаких требований, поэтому он может делать все, что захочет:

неопределенное поведение

поведение, которое может возникнуть при использовании ошибочной программной конструкции или ошибочных данных, к которым настоящий международный стандарт не предъявляет никаких требований.

Как примечание, это неопределенное поведение, но это не обязательно хороший пример. На g++ 4.4.1 он откажется компилировать с:

ошибка: lvalue требуется как левый операнд присваивания

потому что результат постинкремента не является lvalue.

По сути, да, если и только если эти 10 инструкций одинаково доступны. Рассмотрим следующий код:

int main () {
  if (false) {
    int x = 0; x++ = 2;
  }
  std::cout << "Hello, world" << std::endl;
}

UB может быть обнаружен во время компиляции, и генерация кода для этой конкретной ветви может привести к бессмысленному коду. Однако не очень условный прыжок должен пропустить все это и пройти прямо после закрытия }

(Этот вопрос не является дубликатом, потому что обнаружение UB во время компиляции ранее не рассматривалось)

Конкретный компилятор (если не глючит) всегда будет иметь одинаковое поведение (определенно без случайного кода) при обнаружении таких конструкций (если контекст кода не отличается).

На практике "неопределенное поведение" означает "разные компиляторы будут обрабатывать вещи по-разному".

Если вы хотите знать, "будет ли ваш воображаемый компилятор соответствовать стандартам C++?" - ответ, я думаю, да.

Из проекта стандарта / http://www.kuzbass.ru:8086/docs/isocpp/intro.html / [1.3.12]

[Примечание: допустимое неопределенное поведение варьируется от полного игнорирования ситуации с непредсказуемыми результатами до поведения во время перевода или выполнения программы задокументированным способом, характерным для среды (с выдачей диагностического сообщения или без него), до прекращения перевода или выполнения (с выдачей диагностического сообщения). Многие ошибочные программные конструкции не порождают неопределенного поведения; они должны быть диагностированы. ]

Определенно не перечисляются вставки случайных инструкций, и трудно утверждать, что аспект "диапазонов" будет включать в себя решение вставлять случайные инструкции как находящиеся где-нибудь на континууме между перечисленными поведениями.;-)

Другие вопросы по тегам