crypt of decay - the joys of C [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

the joys of C [Mar. 4th, 2016|06:11 pm]
Previous Entry Add to Memories Tell A Friend Next Entry
а вы знаете, что любой кусок кода, который содержит нижеследующее, может быть смело редуцирован в ничто?
unsigned char b;
...
всякая фигня
...
...(b<<24)

поясняю. «вдвигание» единицы в знаковый бит в цэ не определено. b по сишным правилам получает повышение до int. b может быть больше 0x7f. вуаля: undefined behavior. поэтому весь код до и после сдвига может быть смело выкинут компилятором на помойку, потому что его поведение тоже не определено. такое выкидывание не нарушает никаких правил и стандартов.

а мораль сей сказки простая: пойдите и поищите, нет ли у вас в коде такого сдвига без кастов в беззнаковое. есть? поздравляю, ваша программа — непортабельное дерьмо.

так что пишите на си, зайчики! видите, как легко на нём писать программы, которые потенциально можно оптимизировать в ноль инструкций? заодно можете спросить про этот код у очередного долбоёба, который начнёт вам рассказывать про «портабельность сишечки». потом смачно повозите его ебалом по его же говну и пиздюлями прогоните из своего дома.
Linkmeow!

Comments:
From:(Anonymous)
Date:March 6th, 2016 - 03:48 am
(Link)
Спасибо, пошел искать бяку в своем коде.
[User Picture]
From:[info]ketmar
Date:March 6th, 2016 - 12:35 pm
(Link)
заодно и ~0>>n можно вычистить (выдвигание из знакового бита тоже...), и любимую людьми реализацию циклосдвига: (value<
[Error: Irreparable invalid markup ('<count)|(value>') in entry. Owner must fix manually. Raw contents below.]

заодно и ~0>>n можно вычистить (выдвигание из знакового бита тоже...), и любимую людьми реализацию циклосдвига: (value<<count)|(value>>(32-count)) -- тут сразу две жопы: сдвиг на 32 для инта размером 32 бита не определён, сдвиг на ноль в си тоже не определён.