Здравствуйте, Qbit86, Вы писали:
Q>Выглядит как UB, и компилятор пользуется своим правом произвола. Вероятно, он просто сгенерировал возврат нуля, задетектив UB.
Здравствуйте, kov_serg, Вы писали:
_>Знатоки стандарта, что вас давно не слышно. Что должна вернуть функция? _>int fn() { int x; return x || !x; }
какая разница что должна вернуть "функция" — если это говнокод и ему не место в нормальном проекте ..
теоретически вообще компилятор может не инициализировать объявляемые таким образом переменные и просто назначить для неё некую ("произвольную") ячейку памяти, в которой могло остаться любое значение (от работы предыдущих программ и т.д.)
но тогда бы да, по идее возвращаемое значение — должно было бы быть равно единице всегда .. значит всё таки компилятор детектит — и возвращает ноль, как Qbit86 и пишет ..
Здравствуйте, Qbit86, Вы писали:
Q>>>Вероятно, он просто сгенерировал возврат нуля, задетектив UB.
Q>Бывает и хуже: https://users.livejournal.com/-winnie/426746.html
Это тоже лютый идиотизм. Вместо добавления модификаторов типа делают так, как будто мы работаем на другой платформе и при этом тоже нарушая логику. Вместо исключения, выкидывая условие выхода из цикла.
_>>Как вы относитесь к такому праву?
Q>Перешёл на C#
Здравствуйте, xma, Вы писали:
xma>какая разница что должна вернуть "функция" — если это говнокод и ему не место в нормальном проекте ..
Есть мнение что это не говонокод. Это говно компилятор.
xma>теоретически вообще компилятор может не инициализировать объявляемые таким образом переменные и просто назначить для неё некую ("произвольную") ячейку памяти, в которой могло остаться любое значение (от работы предыдущих программ и т.д.)
Бл%ть что это за противоречивая теория такая используется?
xma>но тогда бы да, по идее возвращаемое значение — должно было бы быть равно единице всегда .. значит всё таки компилятор детектит — и возвращает ноль, как Qbit86 и пишет ..
Это значит что компилятор содержит лоигескую ошибку и выполняет не допустимые математические преобразования без каких либо доказательств.
Тут явное деление на 0 и компилятор должен просто не скомпилировать этот код. А runtime выкинуть исключение. Но в место этого вы видим разброс и шатания. И всем норм, а главное всё по стандарту
_>От чего может зависеть результат? И почему clang начиная с 5-ой версии считает что 0 будет самый раз?
Хороший и добрый компилятор, а ведь мог и бритвочкой полоснуть диск отформатировать. Имел право.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, kov_serg, Вы писали:
_>Знатоки стандарта, что вас давно не слышно. Что должна вернуть функция? _>
_>int fn() { int x; return x || !x; }
_>
_>От чего может зависеть результат? И почему clang начиная с 5-ой версии считает что 0 будет самый раз?
Возвратит хрень. Потому что используется не инициализированная переменная. Какую хрень — зависит от компилятора. И не нужно искать тут тайные знания.
А написание подобной функции — явный признак крайне низкой квалификации программиста. (если честно — знание правил инициализации ожидается начиная от уровня джуна)
Здравствуйте, AeroSun, Вы писали:
AS>Возвратит хрень. Потому что используется не инициализированная переменная. Какую хрень — зависит от компилятора. И не нужно искать тут тайные знания.
Вы можете аргументировано обосновать эту точку зрения?
AS>А написание подобной функции — явный признак крайне низкой квалификации программиста. (если честно — знание правил инициализации ожидается начиная от уровня джуна)
Это синтетический пример. Реальность гораздо страшнее. Вы не поверите, но программы обычно пишут люди разной квалификации и не в одиночку.
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, AeroSun, Вы писали:
AS>>Возвратит хрень. Потому что используется не инициализированная переменная. Какую хрень — зависит от компилятора. И не нужно искать тут тайные знания. _>Вы можете аргументировано обосновать эту точку зрения?
Да. Это не инициализированная переменная. Работа с ней — UB. Компилятор может хоть 42 возвращать в качестве значения любой операции с ней — это его право.
AS>>А написание подобной функции — явный признак крайне низкой квалификации программиста. (если честно — знание правил инициализации ожидается начиная от уровня джуна) _>Это синтетический пример. Реальность гораздо страшнее. Вы не поверите, но программы обычно пишут люди разной квалификации и не в одиночку.
Это в любом языке так — всегда можно сделать полную дичь. Только в одних языках это видно сразу, другие прячут проблему под ковёр.
В с++, если переменная не инициализирована — код ревью не должен проходить, либо человек должен обосновать отсутствие инициализации.
AS>>А написание подобной функции — явный признак крайне низкой квалификации программиста. (если честно — знание правил инициализации ожидается начиная от уровня джуна) _>Это синтетический пример. Реальность гораздо страшнее. Вы не поверите, но программы обычно пишут люди разной квалификации и не в одиночку.
Тебе о чем и говорят — человек написавший такой код имеет низкую квалификацию, и хорошо что компилятор помог отловить этот баг, вернув ноль.
Ну или pain in the ass, в зависимости от того, каким местом думает юзер.
Ну и вдогонку, если очень хочется щегольнуть обширным интеллектом, то clang умеет выдавать дамп AST, а LLVM — IR после каждого прохода. Если их внимательно покурить, будет сразу понятно, откуда взялся ноль. Но материться в комментариях на ломанном рунглише, конечно, куда интересней.
Q>Ну и вдогонку, если очень хочется щегольнуть обширным интеллектом, то clang умеет выдавать дамп AST, а LLVM — IR после каждого прохода. Если их внимательно покурить, будет сразу понятно, откуда взялся ноль. Но материться в комментариях на ломанном рунглише, конечно, куда интересней.
Ну это же kov_serg он любит ходить с шарманкой (про плохой С++) по дворам как болгарин с обезъяной.