Семантика языка C или C ++ образует контраст с пользователем. Некоторые конструкции не имеют каких-либо ограничений на их поведение, либо из-за отсутствия определенного поведения в некоторых случаях (например, разыменование указателя, который не указывает на объект, например, нулевого указателя), либо из-за того, что оно сделано явно не определено. В любом случае не предоставляется никаких гарантий относительно поведения , следующего за .
А как же прошлое? Эти инструкции, которые определили поведение и дали результат. Я полагаю, что результат может быть удален, но предыдущие взаимодействия могли наблюдаться в прошлом.
Может ли неопределенное поведение быть предсказуемым, чтобы не возникали некоторые результаты? Например:
std::cout << "hello, world" << std::endl; // with a flush
float f = 1./0.; // UB: cancels previous syscall?
Не будет ли системный вызов write
(при условии, что Unix) соответствовать здесь?
А как насчет модели памяти? Существует гарантия того, что все операции над атомарным объектом, мьютексом и всеми последовательно согласованными операциями имеют порядок (каждая соответствует потоку команд, но их объединение не обязательно); Когда применяется эта гарантия, если программа демонстрирует неопределенное поведение?
Может ли реализация использовать неопределенное поведение в какой-то момент выполнения программы в качестве предлога для несоблюдения требований к модели памяти? Другими словами, в какие моменты клиент контракта с языковой семантикой (пользователь) может ожидать выполнения этих требований (при операциях ввода-вывода, при выполнении команд)?
Уточнение: только правильно сформированные программы
(Я понимаю, что, возможно, я не был таким конкретным, как я хотел.)
Некоторые программы, исходный код которых нарушает правило согласованности или правильности:
- нарушение правила одного определения
- шаблонов, которые не имеют действительной специализации
- шаблоны, которые связываются с разными именами в разных точках
описаны как полностью недействительные. Эти программы могут быть отклонены компилятором с помощью диагностики или скомпилированы, но в этом случае выполнение программы не имеет определенного поведения. Давайте назовем это « a priori UB».
Вопрос не об этих программах, а о правильно сформированных программах, которые могут иметь некоторое четко определенное выполнение хотя бы в течение некоторого времени.