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 ответов

8 просмотров

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

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

Может кто-то объяснить, почему 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...

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

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
Карта сайта