Re[8]: C++ illegal instruction
От: sergii.p  
Дата: 06.08.25 08:06
Оценка: 6 (1) +1
Здравствуйте, ·, Вы писали:

·>
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 исчезнет.
Что произошло у ТС — не понимаю. Возможно, это бунт разработчиков компилятора, их следует признать еретиками и сжечь на костре.
Отредактировано 06.08.2025 9:20 sergii.p . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.