Что должна вернуть функция?
От: kov_serg Россия  
Дата: 15.07.21 15:37
Оценка: :))) :))
Знатоки стандарта, что вас давно не слышно. Что должна вернуть функция?
int fn() { int x; return x || !x; }

От чего может зависеть результат? И почему clang начиная с 5-ой версии считает что 0 будет самый раз?
Re: Undefined behavior
От: Qbit86 Кипр
Дата: 15.07.21 15:58
Оценка: +6
Здравствуйте, kov_serg, Вы писали:

_>И почему clang начиная с 5-ой версии считает что 0 будет самый раз?


Выглядит как UB, и компилятор пользуется своим правом произвола. Вероятно, он просто сгенерировал возврат нуля, задетектив UB.
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: Undefined behavior
От: kov_serg Россия  
Дата: 15.07.21 16:00
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Выглядит как UB, и компилятор пользуется своим правом произвола. Вероятно, он просто сгенерировал возврат нуля, задетектив UB.


Как вы относитесь к такому праву?
Re[3]: Произвол
От: Qbit86 Кипр
Дата: 15.07.21 23:04
Оценка: :)
Здравствуйте, kov_serg, Вы писали:

Q>>Вероятно, он просто сгенерировал возврат нуля, задетектив UB.


Бывает и хуже: https://users.livejournal.com/-winnie/426746.html

_>Как вы относитесь к такому праву?


Перешёл на C# :)
Глаза у меня добрые, но рубашка — смирительная!
Re: Что должна вернуть функция?
От: xma  
Дата: 16.07.21 00:30
Оценка: +4 :)
Здравствуйте, kov_serg, Вы писали:

_>Знатоки стандарта, что вас давно не слышно. Что должна вернуть функция?

_>int fn() { int x; return x || !x; }

какая разница что должна вернуть "функция" — если это говнокод и ему не место в нормальном проекте ..

теоретически вообще компилятор может не инициализировать объявляемые таким образом переменные и просто назначить для неё некую ("произвольную") ячейку памяти, в которой могло остаться любое значение (от работы предыдущих программ и т.д.)

но тогда бы да, по идее возвращаемое значение — должно было бы быть равно единице всегда .. значит всё таки компилятор детектит — и возвращает ноль, как Qbit86 и пишет ..
Re: Что должна вернуть функция?
От: σ  
Дата: 16.07.21 02:05
Оценка:
_>Знатоки стандарта, что вас давно не слышно. Что должна вернуть функция?
_>
_>int fn() { int x; return x || !x; }
_>


The Standard imposes no requirement on implementations with respect to this program.
Re: Мне вот этот пример нравится
От: Alexander G Украина  
Дата: 16.07.21 08:26
Оценка:
У каждого компилятора своё мнение:

https://godbolt.org/z/9Wh6T9
Русский военный корабль идёт ко дну!
Re[4]: Произвол
От: kov_serg Россия  
Дата: 16.07.21 09:01
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>>>Вероятно, он просто сгенерировал возврат нуля, задетектив UB.


Q>Бывает и хуже: https://users.livejournal.com/-winnie/426746.html

Это тоже лютый идиотизм. Вместо добавления модификаторов типа делают так, как будто мы работаем на другой платформе и при этом тоже нарушая логику. Вместо исключения, выкидывая условие выхода из цикла.

_>>Как вы относитесь к такому праву?


Q>Перешёл на C#


Там тоже идиотских решений хватает
Re[2]: Что должна вернуть функция?
От: kov_serg Россия  
Дата: 16.07.21 09:05
Оценка: +2 -1
Здравствуйте, xma, Вы писали:

xma>какая разница что должна вернуть "функция" — если это говнокод и ему не место в нормальном проекте ..

Есть мнение что это не говонокод. Это говно компилятор.

xma>теоретически вообще компилятор может не инициализировать объявляемые таким образом переменные и просто назначить для неё некую ("произвольную") ячейку памяти, в которой могло остаться любое значение (от работы предыдущих программ и т.д.)

Бл%ть что это за противоречивая теория такая используется?

xma>но тогда бы да, по идее возвращаемое значение — должно было бы быть равно единице всегда .. значит всё таки компилятор детектит — и возвращает ноль, как Qbit86 и пишет ..

Это значит что компилятор содержит лоигескую ошибку и выполняет не допустимые математические преобразования без каких либо доказательств.
Re[2]: Мне вот этот пример нравится
От: kov_serg Россия  
Дата: 16.07.21 09:08
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>У каждого компилятора своё мнение:


AG>https://godbolt.org/z/9Wh6T9


Тут явное деление на 0 и компилятор должен просто не скомпилировать этот код. А runtime выкинуть исключение. Но в место этого вы видим разброс и шатания. И всем норм, а главное всё по стандарту
Отредактировано 16.07.2021 9:09 kov_serg . Предыдущая версия .
Re: Что должна вернуть функция?
От: ononim  
Дата: 16.07.21 09:59
Оценка: +1 :)
_>От чего может зависеть результат? И почему clang начиная с 5-ой версии считает что 0 будет самый раз?
Хороший и добрый компилятор, а ведь мог и бритвочкой полоснуть диск отформатировать. Имел право.
Как много веселых ребят, и все делают велосипед...
Re: Что должна вернуть функция?
От: AeroSun  
Дата: 16.07.21 10:16
Оценка: +2 :)
Здравствуйте, kov_serg, Вы писали:

_>Знатоки стандарта, что вас давно не слышно. Что должна вернуть функция?

_>
_>int fn() { int x; return x || !x; }
_>

_>От чего может зависеть результат? И почему clang начиная с 5-ой версии считает что 0 будет самый раз?

Возвратит хрень. Потому что используется не инициализированная переменная. Какую хрень — зависит от компилятора. И не нужно искать тут тайные знания.
А написание подобной функции — явный признак крайне низкой квалификации программиста. (если честно — знание правил инициализации ожидается начиная от уровня джуна)
Re: Что должна вернуть функция?
От: Mr.Delphist  
Дата: 16.07.21 11:01
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Знатоки стандарта, что вас давно не слышно. Что должна вернуть функция?

_>
_>int fn() { int x; return x || !x; }
_>

_>От чего может зависеть результат? И почему clang начиная с 5-ой версии считает что 0 будет самый раз?

Починил. Не благодарите.
int fn() { int x; return --x || !(++x) + 1; }
Re[2]: Что должна вернуть функция?
От: kov_serg Россия  
Дата: 16.07.21 11:01
Оценка: +2
Здравствуйте, AeroSun, Вы писали:

AS>Возвратит хрень. Потому что используется не инициализированная переменная. Какую хрень — зависит от компилятора. И не нужно искать тут тайные знания.

Вы можете аргументировано обосновать эту точку зрения?

AS>А написание подобной функции — явный признак крайне низкой квалификации программиста. (если честно — знание правил инициализации ожидается начиная от уровня джуна)

Это синтетический пример. Реальность гораздо страшнее. Вы не поверите, но программы обычно пишут люди разной квалификации и не в одиночку.
Re[2]: Что должна вернуть функция?
От: kov_serg Россия  
Дата: 16.07.21 11:03
Оценка: :)
Здравствуйте, Mr.Delphist, Вы писали:

MD>Починил. Не благодарите.

MD>
MD>int fn() { int x; return --x || !(++x) + 1; }
MD>


Теперь эту?
unsigned fn(unsigned x) { unsigned u; return x+1u-u+u; }
Re[3]: Что должна вернуть функция?
От: AeroSun  
Дата: 16.07.21 12:29
Оценка: -1
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, AeroSun, Вы писали:


AS>>Возвратит хрень. Потому что используется не инициализированная переменная. Какую хрень — зависит от компилятора. И не нужно искать тут тайные знания.

_>Вы можете аргументировано обосновать эту точку зрения?

Да. Это не инициализированная переменная. Работа с ней — UB. Компилятор может хоть 42 возвращать в качестве значения любой операции с ней — это его право.

AS>>А написание подобной функции — явный признак крайне низкой квалификации программиста. (если честно — знание правил инициализации ожидается начиная от уровня джуна)

_>Это синтетический пример. Реальность гораздо страшнее. Вы не поверите, но программы обычно пишут люди разной квалификации и не в одиночку.

Это в любом языке так — всегда можно сделать полную дичь. Только в одних языках это видно сразу, другие прячут проблему под ковёр.
В с++, если переменная не инициализирована — код ревью не должен проходить, либо человек должен обосновать отсутствие инициализации.
Re[3]: Что должна вернуть функция?
От: Muxa  
Дата: 16.07.21 13:55
Оценка:
AS>>А написание подобной функции — явный признак крайне низкой квалификации программиста. (если честно — знание правил инициализации ожидается начиная от уровня джуна)
_>Это синтетический пример. Реальность гораздо страшнее. Вы не поверите, но программы обычно пишут люди разной квалификации и не в одиночку.

Тебе о чем и говорят — человек написавший такой код имеет низкую квалификацию, и хорошо что компилятор помог отловить этот баг, вернув ноль.
Re: головную боль (+)
От: Quebecois Канада https://www.canada.ca/
Дата: 17.07.21 19:52
Оценка: +1
Здравствуйте, kov_serg, Вы писали:

Ну или pain in the ass, в зависимости от того, каким местом думает юзер.

Ну и вдогонку, если очень хочется щегольнуть обширным интеллектом, то clang умеет выдавать дамп AST, а LLVM — IR после каждого прохода. Если их внимательно покурить, будет сразу понятно, откуда взялся ноль. Но материться в комментариях на ломанном рунглише, конечно, куда интересней.
Re[3]: Здравый смысл
От: Quebecois Канада https://www.canada.ca/
Дата: 17.07.21 19:54
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Как вы относитесь к такому праву?

Читаю варнинги и не морочу людям голову.
Re[2]: головную боль (+)
От: YuriV  
Дата: 23.07.21 06:34
Оценка:
Здравствуйте, Quebecois, Вы писали:


Q>Ну и вдогонку, если очень хочется щегольнуть обширным интеллектом, то clang умеет выдавать дамп AST, а LLVM — IR после каждого прохода. Если их внимательно покурить, будет сразу понятно, откуда взялся ноль. Но материться в комментариях на ломанном рунглише, конечно, куда интересней.


Ну это же kov_serg он любит ходить с шарманкой (про плохой С++) по дворам как болгарин с обезъяной.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.