Я хочу увидеть пример, где что-то печатается в стандартный вывод (или stderr), который не был бы напечатан, если бы миф был правдой, или где что-то не напечатано, что было бы, или где что-то напечатано, но текст неправильный. Почему настаивают на печати на стандартный вывод? Я видел несколько примеров, в которых запись в изменчивую переменную используется как «внешне наблюдаемый» побочный эффект. Меня не очень убеждают эти примеры, потому что я не понимаю, как я мог бы фактически наблюдать эти записи в обычном случае обычного процесса в пользовательском пространстве (т. е. не в ядре ОС, драйвере устройства или встроенном устройстве).
Изменить: Якк - Адам Невромонт отметил, что запись в стандартный вывод осуществляется посредством вызовов библиотеки, о которых компилятор не может рассуждать. Мне пришло в голову, что существует еще одна форма межпроцессного взаимодействия, о которой, я думаю, компилятор мог бы рассуждать - атомарные записи в память, совместно используемую другим процессом. К сожалению, похоже, что межпроцессное взаимодействие с использованием общей памяти не кодифицировано в нормативных частях стандарта C++.
Печать должна выполняться с помощью кода, который выполняется перед строкой, ответственной за для неопределенного поведения. Меня не интересуют примеры неправильного вывода, выводимые после того, как строка с неопределенным поведением уже была выполнена. Примечание: поскольку нет смысла говорить о выполнении программы, поведение которой не определено, пожалуйста, при интерпретации этого абзаца вставьте «если поведение не было неопределенным».
Редактировать: Я нашел лучший способ сформулировать это: я прошу пример, который продемонстрировал бы разницу между реальным неопределенным поведением: «все ставки отключены, как только программа получит входные данные для в котором поведение программы неопределенно» и вымышленная версия неопределенного поведения: «программа выполняется нормально до тех пор, пока не достигнет строки, вызывающей неопределенное поведение, и после этого все ставки отключены». Я хочу увидеть пример кода, который бы выполнялся нормально, если бы миф был правдой, вместо этого он делал бы что-то странное. Код, который каким-то образом идет «после» неправильного поведения плохой строки, может быть объяснен носовыми демонами как с помощью правильной, так и неправильной ментальной модели неопределенного поведения и, таким образом, не является контрпримером.
Вот самое близкое, что мне удалось найти:
Код: Выделить всё
void bar (void);
int a;
void foo3 (unsigned y, unsigned z)
{
bar();
a = y%z;
}
Код: Выделить всё
foo3:
pushl %ebp
movl %esp, %ebp
pushl %esi
subl $4, %esp
movl 8(%ebp), %eax
xorl %edx, %edx
divl 12(%ebp)
Подробнее здесь: [url]https://stackoverflow.com/questions/78751187/can-you-find-a-real-example-of-time-travel-caused-by-undefined-behaviour[/url]