LINUX.ORG.RU

Почему жабисты и растаманы лучше С++ников

 , ,


4

12

Кажется я понял основную причину, отчего у С++хейтеров постоянно исключения в деструкторах сыпятся и все падает. Почему у них память принципиально течет, и все сегфолтится. У них просто логика античеловеческая. Всё, что не запрещено, то разрешено, или все что не разрешено то запрещено - это две большие разницы, для этих существ неразличимые.

Показываю на примере undefined результата в случае переполнения int в С в компиляторе здорового человека и в компиляторе курильщика.

В компиляторе здорового человека под undefined behavior в случае переполнения int подразумевается, что человек напишет программу так, что переполнения int не будет потому что он предупреждён. Поэтому компилятор может применить к выражениям оптимизации, которые небезопасны в случае переполнения.

В компиляторе курильщика принято считать что раз у нас в стандарте написано что UB, значит мы имеем право генерировать непредсказуемые результаты в ходе оптимизаций.

А это не одно и то же. Оптимизации здорового человека не предполагают нарушения логики работы программы. Если у вас написано x&y то операция И должна быть выполнена. Там нет переполнения. Её надо выполнить, даже если по отдельности икс и игрек переполнились. Вы не можете убрать операцию только потому, что у вас int в качестве аргумента. Выражение должно давать правильный результат при допустимых аргументах, вот что означает undefined behavior у int при недопустимы аргументах.

Оптимизации курильщика же предполагают что выражение может дать непредсказуемый результат всегда. Они просто не понимают, почему так нельзя. «в стандарте написано». Ученым до сих пор непонятно, почему компиляторы курильщика не заменяют все выражения, содержащие int, на вызов random(). Возможно, курильщики просто не знают о существовавнии этой функции и генерят рандом руками на лету.

А теперь эти идиоты добрались до gcc и сломали его. Это печально. Если бы они так кошмарили свою жабку или раст, это было бы смешно и забавно. Но увы, зло пришло и на нашу землю.

А что касается исключений в деструкторах и прочей байды. Так это то же самое. Они просто не понимают почему нельзя. Не запрещено же. Они реально не понимают, зачем существует та или иная штука. Поэтому кстати у них и шаблоны атакуют и bloatят код. Люди просто не могут не «шаблонить». Зомбачи.

Поэтому жабакодеры и растаманы лучше С++ников. С++ гавно а жаба рулит и раст рулит. GC в каждый дом. Исключения в каждый деструктор. Потому что надо жить не по лжи.

Перемещено tailgunner из development

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

thesis ★★★★★ ()
Ответ на: комментарий от thesis

ну не надо так. они могут и легко бы сделали это, просто не хотят.

ckotinko ☆☆☆ ()

у тебя до сих пор бомбит...

[defns.undefined]

Permissible undefined behavior ranges from ignoring the situation completely with unpredictable results....

unpredictable

таки да, random() лучше подходит

anonymous ()

TC попутал undefined behavior и unspecified results. /thread

pftBest ★★★★ ()

Забавно наблюдать такой пост от человека, имевшего отношение к драйверам ATI. Которые как раз таки были на C++ и регулярно сегфолтились. Стектрейс иксов могу приложить, если хочешь, у меня где-то есть коллекция.

hateyoufeel ★★★★★ ()
Ответ на: комментарий от hateyoufeel

нет, это ты попутал

[expr]

4. If during the evaluation of an expression, the result is not mathematically defined or not in the range of representable values for its type, the behavior is undefined.

undefined

anonymous ()
Ответ на: комментарий от pftBest

results таки должны быть specified. вот в чем разница между курильиками и здоровыми людьми.

ckotinko ☆☆☆ ()
Ответ на: комментарий от hateyoufeel

иксы ко мне не относились, заранее спасибо. я и сам их падения ловил.

ckotinko ☆☆☆ ()

Hail LISP!

//Оп-па, сегодня уже пятница?!?!?!

timdorohin ★★★ ()
Ответ на: нет, это ты попутал от anonymous

как же херово быть курильщиком.

логика как бы отключается. есть вилка А или Б. в Б написано что undefined. значит всегда undefined.

что тут сказать... уже все понятно. таких людей нужно кидать в раст и жабу. чем дальше от нас тем лучше.

ckotinko ☆☆☆ ()

Ну налажал, с каждым бывает, столько боли-то зачем? ЧСВ суперкодера задето?

anonymous ()

Оптимизации здорового человека не предполагают нарушения логики работы программы.

Прикинь, оптимизирующие компиляторы для С и С++ так и разрабатывают. Никто специально не ломает «неправильный» код, который является частью исторически сложившихся идиом. Только вот

компилятор может применить к выражениям оптимизации, которые небезопасны в случае переполнения

как раз и приводит к описаным последствиям в некоторых случаях.

annulen ★★★★★ ()
Ответ на: комментарий от annulen

Прикинь, оптимизирующие компиляторы для С и С++ так и разрабатывают

вот с этого момента поподробнее. благо компиляторов у нас всего лишь два: gcc и llvm. расскажите мне, какая оптимизация могла удалить операцию И в этом выражении:

int index = 8191& int(8192.0f*angle/M_PI);
я просто видел что её удалили и результат был отрицательным.

Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/5/lto-wrapper Target: i686-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.4' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-i386/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-i386 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-i386 --with-arch-directory=i386 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-targets=all --enable-multiarch --disable-werror --with-arch-32=i686 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu Thread model: posix gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)

ckotinko ☆☆☆ ()
Последнее исправление: ckotinko (всего исправлений: 1)
Ответ на: комментарий от annulen

Никто специально не ломает «неправильный» код, который является частью исторически сложившихся идиом

btw, давно вынашиваю план написать компилятор C, который будет выдавать максимально неожиданное поведение в рамках стандарта. Самое то, чтоб соответствие стандарту проверять и ТС-ов выявлять.

anonymous ()
Ответ на: комментарий от ckotinko

это тебя нельзя подпускать к нормальным языкам

как-то всё у тебя через жопу наоборот получается: лепишь ub ты, а кидать куда-то нужно меня. но это уже оффтопик, т.е. к доктору

anonymous ()
Ответ на: комментарий от vzzo

это double. я в дебаге отловил, просто потому что поставил проверку на всякий случай.

ckotinko ☆☆☆ ()
Последнее исправление: ckotinko (всего исправлений: 1)
Ответ на: комментарий от ckotinko

я и сам их падения ловил.

И как? Ты сделал выводы?

Если что, я не пытаюсь сказать, что на C/C++ нельзя писать качественный код. Я к тому, что на других языках это может быть дешевле и быстрее.

hateyoufeel ★★★★★ ()
Ответ на: комментарий от ckotinko

Где-то сработала оптимизация, удаляющая код, который никогда не будет выполнен. А может это вообще баг в компиялторе. Берешь ubsan и проверяешь

annulen ★★★★★ ()
Ответ на: комментарий от ckotinko

Само выражение отдельно от контекста не портит ни gcc ни clang. Значит у тебя проблема в другом месте в коде. Возможно там где используется index или там откуда приходит angle.

pftBest ★★★★ ()
Ответ на: комментарий от hateyoufeel

какие выводы я должен был делать? в AMD приходит engineering problem report, по нему проходит «расследование», он направляется на соответствующую команду, и там это фиксят. ну так было когда я там работал. не очень понимаю, почему я должен был фиксить баги в иксах если они ко мне не приходили(на лоре писали что падает xvba когда-то но это зафиксили по другому).

ckotinko ☆☆☆ ()
Ответ на: комментарий от annulen

а тебя не смущает, что «опмитизация» нарушила требования исходного кода? оптимизация не означает что можно рандом гнать, лишь бы было «похоже».

ckotinko ☆☆☆ ()
Ответ на: комментарий от ckotinko

Никто не говорил, что именно ты должен был фиксить все баги.

hateyoufeel ★★★★★ ()
Ответ на: комментарий от pftBest

у меня это была первая строка в методе. да какая нахер разница. а что, не понятно, что нельзя делать «оптимизации» которые противоречат исходному коду? а вообще, а можно было оптимизировать fistp+and? ну просто как? а что это было то вообще?

ckotinko ☆☆☆ ()

Лучше бы про процессор рассказал.

Deleted ()
Ответ на: комментарий от anonymous

Есть ubsan, который тупо валит процесс с обнаруженным UB

annulen ★★★★★ ()
Ответ на: комментарий от ckotinko

ничего она не нарушила. по валидной части выражения (которая вычисляется в double) сгенерирован код, по невалидной — нет. когда стало понятно, что результат тебе не нужен, зачем лишние инструкции вставлять? это и есть оптимизация. меньше инструкций — быстрее программа.

кстати, это наиболее частое поведение gcc при ub

anonymous ()
Ответ на: комментарий от ckotinko

а тебя не смущает, что «опмитизация» нарушила требования исходного кода

А что это такое? Оптимизатор не может знать таких вещей, он видит отдельные выражения и оптимизирует их, как умеет.

Если разработчики компилитора обнаружат, что начинает ломаться какая-то идиома с переполнением и т.п., часто встречающаяся в реальном коде, то они подстелят соломку и остановят оптимизацю какого-то подвыражения.

annulen ★★★★★ ()
Ответ на: комментарий от vzzo

-O2 было и LTO точно не было. не знаю что там в сферическом вакууме, я это поймал устойчиво в большой проекте.

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

А тут оказывается с 5.3 по 5.4 точно сломано еще более зверски.

А кстати, в gcc4 точно на x86-64 без выключения sse есть баг - округление к ближайшему четному. Кто нибудь помнит баг Qt4.8.3 с отрисовкой? его в итоге пофиксили после долгого кормления говном разрабов типа нельзя так делать. Дело в том что sse раундит вместо ближайшего целого к ближайшему четному.

я изза этого теперь везде ftrunc делают перед кастом к инту. и проверяю на дизассемблере.

ckotinko ☆☆☆ ()
Последнее исправление: ckotinko (всего исправлений: 2)
Ответ на: комментарий от annulen

он видит отдельные выражения и оптимизирует их, как умеет.

так давай просто скажем что он сломан, а?

не стреляйте в оптимизатор, но оптимизирует как может.

я может чего-то не понимаю но оптимизация здорового человек не подразумевает генерацию безумного кода.

ckotinko ☆☆☆ ()
Ответ на: комментарий от anonymous

по невалидной — нет

давай ты просто скажешь что ключевое слово Int = вызову random(). любой int = случайному числу. так же будет легче.

ckotinko ☆☆☆ ()
Ответ на: комментарий от ckotinko

я может чего-то не понимаю

Да. Любой оптимизатор, применимый на практике (т.е. исключаем symbolic execution), работает точно так же: оптимизирует на уровне подвыражений. Просто в одних языках есть UB (и они работают быстрее, но может возникнуть вот такой факап в результате каскада несвязанных оптимизаций), а в других нет. «немножко беременным» быть не получится

annulen ★★★★★ ()
Ответ на: комментарий от ckotinko

ключевое слово Int = вызову random(). любой int = случайному числу.

Ну внутри оптимизатора так и есть, это называется undef. Любое число умножить на undef будет undef. Пытаешься использовать undef в if, можно выкинуть обе ветки. И так далее.

Есть интересный доклад про то как оно все работает:

CppCon 2016: Michael Spencer “My Little Optimizer: Undefined Behavior is Magic"

pftBest ★★★★ ()
Последнее исправление: pftBest (всего исправлений: 1)
Ответ на: комментарий от annulen

давай так договоримся. оптимизация != нарушению работы программы. ок?

давай всё таки зашарим такую тему: если в частном случае у нас есть переполнение, то это не значит что в общем случае код может генерить херню. наоборот, код должен работать только для общего случая, а для частного генерить херню.

ckotinko ☆☆☆ ()
Ответ на: комментарий от annulen

не очень понимаю, что в этом коде не так.

он сводится к mov eax, [esp+8] или +16 в зависимости от разрядности.

ckotinko ☆☆☆ ()
Ответ на: комментарий от ckotinko

ППКС

«Херня» генерится если оптимизатор видит, что UB возникает в общем случае, а если оно может быть только в частном, то генерируется код, считающий что этого частного случая нет. Любое другое поведение - баг в компиляторе.

annulen ★★★★★ ()
Ответ на: комментарий от annulen

херня генерится потому, что какой-то программист(видимо из гомосеков, как это теперь модно на загнивающем западе) который писал gcc был курильщиком, и решил что фраза «UB» в какой-то книжке разрешает ему генерить говно вместо кода. если бы он был здоровым человеком, он бы не стал удалять инструкцию, потому что она там специально была мною написана. а не просто по приколу.

ну правда. так нельзя. оптимизация не подразумевает нарушения логики программы. ну я не знаю как еще сказать. оптимизация - это улучшение существующего. а не написание нового.

я правда не знаю как сказать что нельзя допустим срать в штаны например. ну как бы это же нехорошо. а что тут еще скажешь? ну мне же правда нечего добавить. вот так и с «оптимизациями». нельзя херню пороть под видом «оптимизации». ну неприлично например. ну всем приличным людям же понятно что нельзя. а как объяснить панкам...

ckotinko ☆☆☆ ()
Последнее исправление: ckotinko (всего исправлений: 2)
Ответ на: комментарий от annulen

Что за «частный случай»? Выражение «x & int(y)» - UB, это ясно написано в стандарте. Можно заменить на rand(), как хочет ТС.

anonymous ()
Ответ на: комментарий от anonymous

ой дурак... избавь нас бог от таких дураков, пусть все уйдут на раст с жавой.

ckotinko ☆☆☆ ()
Ответ на: комментарий от ckotinko

Замечательно. Косячишь в си ты, а не я, но уйти на жабу нужно мне. Я догадываюсь, кто в этом треде курильщик.

anonymous ()

Слава PHP, говнокодерам слава!

nihirash ★★★ ()

А печально что таки да, многие валидные оптимизации в компиляторах задвигают из-за того, что комьюнити си - большей частью такие как ТС, пишущие на основе личных мифов о языке. Макроассемблер, ога.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.