170 похожих чатов

Увидел в одном видео, что код по типу этого любым

известным компилем возвращает 42 т.к. использование неинициализированной переменной уб, но gcc при отсутствие флагов компиляции возвращает случайное значение и только при -О2 возвращает 42. Значит ли это, что некоторые уб gcc использует только для оптимизации?
#include <iostream>

int foo(bool c) {
int x, y;
y = c ? x : 42;

return y;
}

int main() {
std::cout << foo(true) << std::endl;
}

34 ответов

10 просмотров

автор видео наверняка этот пример и привёл, чтобы показать что компиляторы могут оптимизировать уб

Он не уб использует а правила языка

Может кто-то объяснить, почему 42? Ведь в функцию передается истина, и нужно вернуть значение x, которое может быть чем угодно.

d7d1cd
Может кто-то объяснить, почему 42? Ведь в функцию ...

Андефайнед бехевиор, мы пытаемся присвоить значение ещё не инициализированной переменной другой переменной

Ты в одном видео увидел бред. Тут ub, x не инициализирован.

мыши
42 это тоже что угодно

Особенно от тебя это символично слышать...

Ilya Zviagin
Ты в одном видео увидел бред. Тут ub, x не инициа...

не сказал бы, что бред, но однозначно UB

мыши
у тебя какие-то проблемы ?

Не ты не понял, я положительном смысле...

мыши
теперь я два раза не понял

Ильюха - человек-загадка

мыши
теперь я два раза не понял

Ну вы же мыши, мыши и задавали Великий Вопрос... Точнее, для нас они были мышами.

Все уб используются для оптимизаций

d7d1cd
Может кто-то объяснить, почему 42? Ведь в функцию ...

В функцию не может быть передан true никак, компилятор это понимает

Kirill Bolshakov
В функцию не может быть передан true никак, компил...

почему не может ? компилятор выкидывает дифференциацию результата, а не ветвление по аргументу

мыши
почему не может ? компилятор выкидывает дифференци...

В данном случае никакого ветвления не будет, c is always false => код схлопывается в return 42

Kirill Bolshakov
В данном случае никакого ветвления не будет, c is ...

мне кажется, это не совсем так ;; Function foo (_Z3foob, funcdef_no=1741, decl_uid=43349, cgraph_uid=508, symbol_order=541) Removing basic block 4 foo (bool c) { int y; int x; int iftmp.0_5; <bb 2> : # DEBUG BEGIN_STMT # DEBUG BEGIN_STMT if (c_2(D) != 0) goto <bb 3>; [INV] else goto <bb 4>; [INV] <bb 3> : iftmp.0_5 = x_4(D); <bb 4> : # DEBUG y => 42 # DEBUG BEGIN_STMT return 42; }

мыши
мне кажется, это не совсем так ;; Function foo (_...

а помоему асм достаточно ясный https://godbolt.org/z/G77bd9

Liber Azerate
Это ещё не SSA даже

там не менее на этом этапе уже нет дифференциации

Liber Azerate
Gimple

Я не понял что ты этим хочешь сказать, но если компилятор оставляет ветвление, то он дурак

d7d1cd
То есть, даже когда туда передают true?

Переформулируй вопрос, я тебя не понял

мыши
там не менее на этом этапе уже нет дифференциации

define dso_local i32 @_Z3foob(i1 zeroext %0) local_unnamed_addr #3 { ret i32 42 } IR, генерируемый шлангом на O3

d7d1cd
То есть, даже когда туда передают true?

Если ты про то, что далее мы передаем туда true, хотя сами создали контракт, что функция принимает только false, то надо понимать, что код функции генерируется независимо от вызова. Генерируя код функции компилятор ясно видит, что true передан быть не может и оптимизирует из этого знания. То что мы потом нарушаем свой же контракт - наша ошибка, которая приводит к некорректному результату

Kirill Bolshakov
Переформулируй вопрос, я тебя не понял

Я в слове ошибся. Даже если в функцию передают true я хотел написать.

d7d1cd
Я в слове ошибся. Даже если в функцию передают tru...

Ниже написал - код функции не зависит от вызова

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта