Что исполняет C++-программа при пропущенном return после сборки с -O2
Raymond Chen explains that compilers place ud2 instructions in places a program should never reach, such as the end of a function that is supposed to return a value but does not. A crash on ud2 therefore indicates a logic error. The author tested the opposite question: whether the absence of a ud2 crash means there is no error. The same C++ function was compiled with 114 versions of GCC and Clang for x86-64 on Compiler Explorer, and a demonstration was run.
Рэймонд Чен объясняет: ud2 в коде ставят там, где программа не должна была оказаться, например в конце функции, которая должна вернуть значение, но не возвращает его, и падение на ud2 означает логическую ошибку. Я проверил обратное: если падения на ud2 нет, значит ли это, что ошибки нет. Одна и та же C+±функция прошла через 114 версий GCC и Clang для x86-64 на Compiler Explorer, плюс запуск демонстрационной программы. Без оптимизации ud2 есть у Clang и у свежих GCC. На -O2 программа с пропущенным return у всех четырёх компиляторов в демо исполнила ветку для других входных данных и завершилась с кодом 0, а функцию без единого return Clang 23.1 оставил пустой, и в демо выполнилась соседняя wipe_disk(). Успешное завершение такую ошибку не обнаруживает. Читать далее