Подтвердить что ты не робот

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

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

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

x++ = 2;

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

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

4b9b3361

Ответ 1

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

undefined поведение

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

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

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

потому что результат пост-приращения не является значением l.

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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