Здравствуйте, ·, Вы писали:
·>SP>>int foo() {}
SP>>void main() {
SP>> foo();
·>
·>Как я понимаю, UB уже тут.
а тут уже начинается интересный пласт вопросов. Доказать, что функция не на всех возможных путях вернула значение (что как я догадываюсь, теоретически невозможно)
int foo(int flag) {
if((flag & 1) == 1){
return 0;
}
if((flag & 1) == 0){
return 1;
}
}
не будем придираться к самой функции. Поколения криворуких программистов могут сделать и не такое. Тут формально return нет и clang честно пишет предупреждение
control reaches end of non-void function но в asm генерирует абсолютно корректный код. То есть компилятор признал что код с душком, но полез делать маленькие оптимизации из предположения что это
корректная программа и смог дойти до правильного ответа.
А теперь представим, что у нас не такой синтетический пример, а что-то реальное с закрученной логикой листов на 5.
p.s опять же UB тут по ветке по-моему понимают несколько привратно. Дескать если компилятор видит UB, он может делать любую дичь. Но он как раз предполагает, что в программе
UB быть не может и делает оптимизации из этого предположения. То есть если в программе на какой-то ветке нет return, да, для компилятора это сигнал что тут UB. Но он сделает предположение, что программа туда просто не дойдёт или в этом случае никто результат проверять не будет. То есть в runtime всё сложится так, что в конечном коде UB исчезнет.
Что произошло у ТС — не понимаю. Возможно, это бунт разработчиков компилятора, их следует признать еретиками и сжечь на костре.