Мне известно, что в C вы можете записывать после конца выделенной памяти, и что вместо сбоя это просто приводит к неопределенному поведению, но каким-то образом после многократного тестирования, даже с циклами и другими переменными, вывод всегда точно такой, как ожидалось.
В частности, я записывал целое число за пределы mallo c (1), как таковое.
int *x = malloc(1);
*x = 123456789;
Это достаточно мало чтобы поместиться в 4 байта (мой компилятор предупреждает меня, что он переполнится, если он слишком большой, что имеет смысл), но все же явно больше, чем один байт, однако все равно как-то работает. Я не смог запустить ни одного теста, который бы не работал ни в очень «определенном» виде, ни в segfault сразу. Такие тесты включают в себя многократную перекомпиляцию и запуск программы, а также вывод значения x, попытки записи поверх него с помощью гигантского массива и попытки записи поверх него с массивом длины 0, выходящим за его границы.
Увидев это, я сразу же пошел и попытался отредактировать строковый литерал, который должен быть только для чтения. Но каким-то образом это сработало, и, казалось, также соответствовало.
Может кто-нибудь порекомендовать тест, который я могу использовать для демонстрации неопределенного поведения? Мой компилятор (Mingw64 на Windows 10) как-то делает что-то, чтобы компенсировать мою кажущуюся глупость? Где носовые демоны?