Во многих дискуссиях о поведении undefined (UB) была высказана точка зрения, что в простом присутствии в программе любой конструкции, которая имеет UB в программе, мандат соответствующей реализации делает что угодно (в том числе ничего). Мой вопрос заключается в том, следует ли это делать в этом смысле даже в тех случаях, когда UB связан с выполнением кода, тогда как поведение (в противном случае), указанное в стандарте, предусматривает, что данный код не должен выполняться (и это возможно для конкретного ввода в программу, он не может быть разрешимым во время компиляции).
Понятно более неформально, запах UB требует согласованной реализации, чтобы решить, что вся программа воняет, и отказываются правильно выполнять даже те части программы, для которых поведение прекрасно определено. Пример программы:
#include <iostream>
int main()
{
int n = 0;
if (false)
n=n++; // Undefined behaviour if it gets executed, which it doesn't
std::cout << "Hi there.\n";
}
Для ясности, Я предполагаю, что программа хорошо сформирована (поэтому, в частности, UB не связан с предварительной обработкой). На самом деле я готов ограничить UB, связанный с "оценками", которые явно не являются объектами компиляции. Определения, относящиеся к приведенному примеру, я думаю, (акцент мой):
После этого выполняется асимметричное, транзитивное, парное отношение между оценками, выполненными одним потоком (1.10), что вызывает частичный порядок среди тех оценок
Вычисления значений операндов оператор упорядочивается перед вычислением значения результата оператора. Если побочный эффект на скалярном объекте не зависит от... или вычисления значения с использованием значения одного и того же скалярного объекта, поведение undefined.
Неявно ясно, что субъекты в последнем предложении, "побочный эффект" и "вычисление значений" являются примерами "оценки", так как это определение "упорядочено до" определено для.
Я полагаю, что в вышеприведенной программе стандарт предусматривает, что не происходит никаких оценок, для которых выполняется условие в конечном предложении (нелогично относительно друг друга и описываемого вида), и что при этом программа не имеет UB; это не ошибочно.
Иными словами, я убежден, что ответ на вопрос о моем названии отрицательный. Однако я был бы признателен (мотивированным) мнениям других людей по этому вопросу.
Может быть, дополнительный вопрос для тех, кто выступает за утвердительный ответ, будет ли это мандатом, что переформатирование вашего жесткого диска может происходить при сборе ошибочной программы?
Некоторые связанные указатели на этом сайте:
- Наблюдаемое поведение и поведение undefined - Что произойдет, если я не вызову деструктор?
- Комментарии к этому ответу qaru.site/info/93404/... (я больше не уверен в своем ответе)
- С++ Какое раннее поведение undefined может проявиться?
- Разница между undefined Поведение и неправильное формирование, не требуется диагностическое сообщение и два его ответа, которые представляют противоположные точки зрения