LINUX.ORG.RU
ФорумTalks

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

 , ,


5

12

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

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

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

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

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

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

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

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

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

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

☆☆☆
Ответ на: комментарий от i36_zubov

идея была такая чтоб угол обрезать в диапазон -пи...пи и свернуть его в «кольцо». поэтому инт и операция и чтоб резать кратные 2пи компоненты.

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

я в ахерении. код переписал на uint в итоге. печально что люди не понимают что уб это не значит рандом. это значит что мы сгенерим идейно правильный код но ЕСЛИ у вас переполнится то никаких гарантий. а не генерим что хотим

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

Можешь кинуть что-нибудь на почитать о такой оптимизации? Я немного не в курсе, а с сишкой работаю: хотелось бы знать где не наткнуться.

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

я не понимаю что конкретно триггерит гцц. вырежу код - скажу точнее. щас пока никак я дурак чайник кофе выпил и мне херово

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

Кстати, в оригинале

int x = 8191 & y;
а не
int x = 8192 & y;

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

я в ахерении. код переписал на uint в итоге.

А не ты ли в другой теме заявлял

надо в стандарт написать что вообще всё ub. чтоб дураки не писали на наших языках

А теперь поджал хвост и убежал на uint у которого нет UB.

pftBest ★★★★
()

GC в каждый дом. Исключения в каждый деструктор.

А потом майнкрафтодети вопят, что кубики (реально кубики, почти никакого сложного 3D) тормозят.

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

Используй Rust, нет UB (на самом деле есть, но не в таком количестве и не в safe Rust), есть все гарантии GC, скорость очень близкая к C

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

Разница принципиальная. Примерно как между пепси и кока-колой.

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

Есть разница между «undefined order» и «undefined behavior». Это не одно и тоже

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

Считаешь ли ты багом в компиляторе что эта программа печатает «value is: 0» ?

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

В частности,

-O2 turns on all optimization flags specified by -O. It also turns on the following optimization flags: <...> -fstrict-overflow

-fstrict-overflow
Allow the compiler to assume strict signed overflow rules, depending on the language being compiled. For C (and C++) this means that overflow when doing arithmetic with signed numbers is undefined, which means that the compiler may assume that it does not happen. This permits various optimizations. For example, the compiler assumes that an expression like «i + 10 > i» is always true for signed «i». This assumption is only valid if signed overflow is undefined, as the expression is false if «i + 10» overflows when using twos complement arithmetic. When this option is in effect any attempt to determine whether an operation on signed numbers overflows must be written carefully to not actually involve overflow.

С такой позиции a * 8 == 0 только если a == 0, что оптимизатор и проверяет.

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

Да, все верно. Я хотел добиться такого анализа от автора треда, но не судьба. Кстати что интересно, на gcc можно обойти эту проблему переписав код так:

void foo(int a) {
    int x = a * 8;
    if (x == 0) {
        return;
    }
    bar(x);
}
Но на clang даже такой вариант ведет себя так как оригинальный. Никуда не спрячешься от UB. :)

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

Чтобы ни было в y, UB или не UB

UB может быть не в y, а в программе, и в таком случае никаких гарантий на поведение программы не даётся, на то оно и undefined.

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

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

Чем докажешь что ты не античеловек?

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

я предлагаю генерить код, который отражает написанное в программе. это что, невыполнимое требование?

Осиль сборку без оптимизаций.

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

Некорректная программа НЕ ДОЛЖНА собираться. И тут не работает отмазка «компилятор не владеет результатом исполнения программы» - компилятор руководствуется при таких оптимизациях ИМЕННО что РЕЗУЛЬТАТОМ. При этом этот результат(компиляции) НИКАК и НИЧЕМ не определён.
Т.к. компилятор ЗНАЕТ, что он генерит ГОВНО и НИКАК на это не реагирует.

Есть 100500 способов прострелить себе ногу. Напиши проверку для всех этих 100500 способов. Давай, обанкроть pvs студию.

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

ну хотя бы потому что XOR в обратную сторону не работает, иначе бы криптографии не было.

Что?

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

Опции уровня `-fstrict-overflow` дают интересное решение: выделить код для опасных операций с int в отдельную библиотеку, и собирать её строго с флагом `-fstrict-overflow`.

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

-fstrict-overflow включена всегда для любого кода, как тебе библиотека поможет?

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

Да он читал документацию, но считает что комплиятор (и документация его) - говно

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

А теперь поджал хвост и убежал на uint у которого нет UB.

Так автор по прежнему мнит себя д'Артаньяном, просто «дураки добрались и до GCC».

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

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

есть все гарантии GC

Ну преувеличивать не надо - не все. Нормальный GC циклические ссылки собирать умеет.

DarkEld3r ★★★★★
()

Доброго всем дня наверно

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

Вот я тут вернулся таки и что мы видим. Какие-то GC, кококо. Вы вообще о чем?

Вопрос, который я поднял был предельно прост: если я пишу выражение, будь добр, компилятор, сделай ровно то, что я от тебя хотел. Можно съоптимизировать это выражение. да. Но ты не можешь отказаться от операции только потому, что ты такой умный и красивый, что решил что тебе лично это не надо. Ну правда я не знаю как объяснить. Давайте так спросим.

ПОЧЕМУ ВЫ УРОДЫ ДУМАЕТЕ ЧТО РАЗ ПЕРЕПОЛНЕНИЕ МОЖЕТ БЫТЬ, ТО НАДО ГЕНЕРИТЬ КОД КАК ЕСЛИ БЫ ПЕРЕПОЛНЕНИЕ ВСЕГДА БУДЕТ?

Ну что такого сложного в утверждении, что «переполнение может быть» не равно «переполнение всегда будет»? что непонятного в том, что код, который UB ПРИ ПЕРЕПОЛНЕНИИ не должен быть UB без переполнения потому что ПЕРЕПОЛНЕНИЯ НЕТ?

Алё, казлины. Если UB при переполнении, то если переполнения нет, UB нет. Что непонятного в этом одном предложении? Вы что, ненормальные что ли?

В стандарте написано, что if(переполнение & int) then UB. это не значит, что if(int) then UB. это не значит, что можно генерить шизокод только потому что у вас int написано.

Тут или понятно или не о чем говорить дальше.

* * *

Ну и да, по мелочи. Ответим тем, кому мы не могли ответить ранее.

компилятор не должен оптимизировать вызов функции atoi. Тут дело даже не в том, что atoi лежит в либлиотеке, и может быть переопределена через LD_PRELOAD. но просто потому что это функция. а если ты её оказывается умеешь вычислять то это жаба в чистом виде, где язык это не только сам язык, но и вот эти рюшечки которые компилятор тоже понимает оказывается. а почему только atoi? а snprintf почему нет? а QWidget::show() можно мне также оптимизировать? почему нет-то? э, алё. только не надо про стандарт. это вам захтелось инлайнить эту никому не нужную функцию. она же никому не нужна. простите, сдающие лабы студенты, я не вас имел ввиду. ну, просто оно не нужно. зачем?

Попытки мне вот этим явно ошибочным поведением компилятора что-то доказать в плане «вот наше UB -это правильно» да пошел ты в жопу, товарищ. То что компилятор генерит говнокод не повод для оправдания этого говнокода. Это только в вашей жабе извращались чтоб повторить ошибку fpu 8086 при вычислении синуса чтоб была совместимость. У нас не так.

А вас мы выгоним из С и С++. Идите в ад уроды.

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

ничего что то, что сотворили разрабы gcc с компилятором, делает его несовместимым с программированием? какой нахер strict oveflow. ну расскажи мне, что такого происходит с int при overflow, что результат становится принципиально неопределен?

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

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

Кококо, покажи мне хоть один компилятор который инлайнит (или вычисляет) вызов atoi (strtol). Мне иногда кажется что ты не с этой планеты.

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

в том самом примере, с какого бодуна проверка (x*8==0) стала всегда true?

ну я слушаю уже. с какого бодуна не-const х * 8 был выкинут. расскажи мне про эти оптимизации уже. может просто у нас слово оптимизации разное означает?

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

Достанем твой пример из небытия:

#include <stdio.h>
#include <stdlib.h>

void bar(int x) {
    printf("value is: %d\n", x);
}

void foo(int a) {
    if (a * 8 == 0) {
        return;
    }
    bar(a * 8);
}

int main() {
    int z = atoi("536870912");
    foo(z);
}
z = const?

если не const,

foo(a=!const) {
    if (!const-a * 8 всегда ли == 0) {
        return;
    }
}

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

Я то могу рассказать, странно что ты этого не знаешь:

1) умножение никогда не может переполнится

2) следовательно x * 8 может быть нулем только если x == 0

3) заменяем if (x * 8 == 0) на if (x == 0)

4) получаем граблями когда приходит число которое переполняет умножение

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

объясни мне пожалуйста, что ты пропустил между (3) и (4). там явно должны быть какие-то логические рассуждения как мы от (3) перешли к (4).

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

ничего что то, что сотворили разрабы gcc с компилятором, делает его несовместимым с программированием?

Ты спецификацию, стандарт, языка читал? Если нет, то попробуй прочитать. Оно же больное на всю голову. Это не компилятор с программированием несовместим, а сам язык.

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

Если UB при переполнении, то если переполнения нет, UB нет.

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

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

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

Однако никто не обещает, что сгенерированный код при этом будет близок к исходному коду на Си.

деревня дураков.жпг

я с тобой больше спорить не буду. ты unfixable. иди глючь дальше со своими друзьями.

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

где ты в стандарте прочитал, что можно при слове int делать некорректный код?

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

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

иди глючь дальше со своими друзьями.

1. Если ты об авторах gcc, clang и стандартов, то это не мои друзья.

2. С твоим нынешним подходом, глючить на современных компиляторах де-факто будет лично *твой* код. Куда бы ты тут на форуме меня ни посылал...

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

>могут быть абсолютно невменяемыми.

какое-то печальное зрелище.

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

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

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

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

в жабу себе оптимизируйте.

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

объясни мне пожалуйста, что ты пропустил между (3) и (4).

0) Программист Петя хотел чтобы в функцию bar не попал ноль

0.1) Программист Петя написал код

...

3) Компилятор заменил функцию

void foo(int a) {
    if (a * 8 == 0) {
        return;
    }
    bar(a * 8);
}
на функцию
void foo(int a) {
    if (a == 0) {
        return;
    }
    bar(a * 8);
}

3.1) Новый код будет работать правильно для всех чисел кроме 536870912, потому что это число вызывает UB

3.2) Петя не проверил входные данные и допустил такое что число 536870912 пришло по сети (или из файла, или из atoi) и попало на вход функции foo.

3.3) Случился UB и программа сработала не так как хотел Петя

4) Петя бежит постить на лор что разрабы gcc дауны и такого не может быть чтобы 0 пришел в bar, потому что «он же проверил»

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

Эй алё. Куда пропал, жабоглот?

Мы внимательно слушаем вообще-то, на каком основании удалилась проверка на ноль. Ты нам расскажешь наконец, на каком основании эта проверка удалилась? удалиться она может только если её результат = const, т.е. все входные аргументы выражения=const. теперь расскажи нам как константой в твоём коде стало «a».

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

на каком основании удалилась проверка на ноль.

Проверка на ноль осталась, умножение удалилось. Ты что читать не умеешь?

pftBest ★★★★
()
Ответ на: >могут быть абсолютно невменяемыми. от ckotinko

вы мне уроды весь тред доказывали

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

Okay.

На будущее совет - постарайся все-таки держать себя в руках, не по-мужски это.

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

Ты что читать не умеешь?

Похоже, у него истерика, на глазах пелена =)

Manhunt ★★★★★
()

Тред — жесть, конечно. ТС — неадекватен. Всем подошедшим к теме с конструктивном спасибо, было интересно и познавательно.

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