crypt of decay - прелести сишечки [entries|archive|friends|userinfo]
ketmar

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

прелести сишечки [Jun. 13th, 2018|11:19 am]
Previous Entry Add to Memories Tell A Friend Next Entry
хотите простую задачку? сконвертировать 2-complement big-endian 32-bit integer в little-endian 32 integer на сишечке. машина у нас тоже little-endian.

реально, подумайте. вам только кажется что это просто. потому что правильно это делается исключительно вот так:
int32_t getBEInt (const void *ptr) {
  const uint8_t *b = (const uint8_t *)ptr;
  int32_t res = b[3]|(b[2]<<8)|(b[1]<<16)|((b[0]&0x7f)<<24);
  if (b[0] >= 0x80) {
    res ^= 0x7fffffff;
    res = -res;
    --res;
  }
  return res;
}

да-да, весь ваш чудесный код, который вы для этого используете — НЕВАЛИДНЫЙ. в нём UB. пытаетесь вдвинуть что-то в знаковый бит? UB! пытаетесь кастануть uint в int? UB для чисел вне диапазона int!

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

соответственно, вдвигать что-либо в знаковый бит — UB. конвертировать беззнаковое в знаковое — только [0..INT_MAX], иначе — UB.

а дегенеративные авторы дегенеративных компиляторов делают оптимизаторы для сферического кода в говне, в котором НИКОГДА НЕ ВСТРЕЧАЕТСЯ UB. внимательно это прочитайте. несколько раз. это значит, например, что для случая `uint32_t v = int32_t_variable;` компилятор вправе сказать VRP, что у `v` НИКОГДА не будет установлен старший бит. а при обратном — что int32_t никогда не будет отрицательным. и повыкидывать к ебеням все проверки на это, которые вы напишете за таким кодом.

думаете, вас это не касается? а вот хуй! gcc, например, очень даже умеет в такие «оптимизации». поэтому забейте себе во все проекты как минимум: «-fno-strict-overflow -fwrapv». конкретно эту ситуацию оно разминирует. да, я в курсе, что «-fno-strict-overflow» не нужно при «-fwrapv», но оно разминирует ещё и некоторые другие случаи (для арифметики указателей).


p.s.: тут всё ещё есть один UB, но нахуй. кто заметит (один уже заметил) — тот молодец.
Linkmeow!

Comments:
From:(Anonymous)
Date:June 13th, 2018 - 08:22 am
(Link)
пиздец ждем комментариев специалистов
[User Picture]
From:[info]ketmar
Date:June 13th, 2018 - 08:27 am
(Link)
на самом деле всё ещё смешнее: поскольку «невалидного» кода овердохуя, то gcc распознаёт паттерн «конверсия endianness путём сдвигов», и преобразует в машинную инструкцию, заодно ослабляя правила. иногда.

а иногда не распознаёт. и не ослабляет.

удачной прогулки по минному полю без карты.
From:(Anonymous)
Date:June 13th, 2018 - 01:23 pm

Привет

(Link)
Кетмарь, как стать таким же пиздатым как ты? Сколько лет ты потратил на программирование? Как не быть ебаным хипстером-фронтэндом, и реально шарить в низкоуровневых языках, линуксах и при этом быть действительно компитентным во всем этом вот?
Захожу в тифарет только чтобы тебя поскролить, вдохновения подчерпнуть, так сказать.
Спасибо тебе за посты.
Денег не дам, сорян.
From:(Anonymous)
Date:June 13th, 2018 - 03:50 pm

Re: Привет

(Link)
> программирование
> байтоебство с битовыми сдвигами
[User Picture]
From:[info]ketmar
Date:June 13th, 2018 - 04:33 pm

Re: Привет

(Link)
позанимайся тридцать лет какой-нибудь хуйнёй — и тоже таким станешь. по дороге очень желательно болеть NIH-синдромом, и стараться переписать самому с нуля всё, до чего руки дотягиваются.
From:(Anonymous)
Date:June 13th, 2018 - 09:27 am
(Link)
Двачую, байтоёбы рабы во всём - рабы машины. рабы предубеждений, рабы производительности, рабы стереотипов, рабы обрабатываемых штеудом х86 типов данных - для них всё, что не кратно 2 байтам и больше 16 байт не может быть примитивным типом, хотя число - это просто число, оно может быть целым, дробным, рациональным, комплексным, но не "в 2 байта в 4 байта в 8 байт". Да, байтобляди были актуальны пару-тройку десятков лет назад, когда кроме этого пресловутого отлизывания регистров и микросхем не было способов заставить машину быстро решать задачу. Но теперь-то в нашем распоряжении оптимизирующие компиляторы, многоядерные процессоры с параллелизацией, которые производительнее машин 20летней давности в сотни тысяч раз. Жаль, что программирование было поглощено стереотипным быдлом, не могущим в думать, и способным работать лишь по зазубренной инструкции, написанной кровью и потом сотен павших хомячков-байтоёбов до него. Настоящее, полноценное программирование, благодаря подобным обмудкам, мало теперь где востребовано. Хотя там где оно востребовано, можно кататься как в масле сыр и получать в три раза больше не то что сениор-байтоёба, а ёбанного заместителя директора быдлоконторы в которой этот байтоёб работает. С другой стороны это и хорошо - в космическую промышленность, Data mining и прочие сложные и непосильные для императивных байтохомячков сферы попадает лишь элита.
From:(Anonymous)
Date:June 13th, 2018 - 10:38 am
(Link)
числа это степени двойки, дебил!
[User Picture]
From:[info]ketmar
Date:June 13th, 2018 - 04:34 pm
(Link)
выше вы могли прочитать плач говнокодера, который зачем-то потратил несколько лет жизни на хацкель-хуяцкель, а голубой вертолёт не прилетел.
From:[info]silly_sad
Date:June 14th, 2018 - 03:40 pm
(Link)
poka on ne skazal rpo "data mining" ja pochti gotov byl razsmotretj jeo argumenty
From:[info]silly_sad
Date:June 14th, 2018 - 03:40 pm
(Link)
ja dumaju tam xackelja v golove ne bylo
From:(Anonymous)
Date:June 14th, 2018 - 08:28 pm
(Link)
Скорее -- вялый закос под vsl.
From:(Anonymous)
Date:June 13th, 2018 - 09:58 am
(Link)
надо расовые жидовские конпеляторы использовать потому что
[User Picture]
From:[info]perfect_kiss
Date:June 13th, 2018 - 11:06 am

ну какбе еще одна причина переходить на раст

(Link)
[User Picture]
From:[info]zim_a
Date:June 13th, 2018 - 11:16 am

Re: ну какбе еще одна причина переходить на раст

(Link)
очередной байт-код
хуй стеклянный ещё никто не предлагал?
[User Picture]
From:[info]ketmar
Date:June 13th, 2018 - 04:39 pm

Re: ну какбе еще одна причина переходить на раст

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

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

также руст «дизайнили» уёбки, которые не имеют ни малейшего понятия о language design. вообще. любой, собственно, язык, который слепо копирует синтаксис шаблонов/генериков из крестов, попадает в эту категорию — и уже только поэтому не стоит дальнейших усилий.

p.s. в дишечке все типы изначально имеют определённую битность и представление (sans endianness), целочисленные переполнения определены.
From:(Anonymous)
Date:June 13th, 2018 - 11:24 am
(Link)
кетмарь, разница между uint и int существует только на уровне интерпретации. ты же должен это знать. для железа никакой разницы нет. и никогда не бывает UB, блядь, что же ты такой тупой то? одно и тоже значение будет трактоваться или как негативное, или как uint, исключительно блядь по твоему желанию.
(Replies frozen) (Thread)
[User Picture]
From:[info]ketmar
Date:June 13th, 2018 - 04:31 pm
(Link)
я думал, ты только моё имя прочесть не можешь — а у тебя, оказывается, всё намного хуже: ты реально олигофрен.
(Replies frozen) (Parent)
From:(Anonymous)
Date:June 13th, 2018 - 11:16 pm
(Link)
В продуктах Microsoft таких проблем не возникает.
[User Picture]
From:[info]ketmar
Date:June 13th, 2018 - 11:24 pm
(Link)
продукты микрософт все просроченые, от них понос.
From:(Anonymous)
Date:June 14th, 2018 - 01:03 am
(Link)
Нет, это ты сожрал наверное не то. Больше не накормим!
From:(Anonymous)
Date:June 14th, 2018 - 01:04 am
(Link)
Кетмар, ты кодер, голосуй - https://eosauthority.com/voting
Ускорим запуск.
[User Picture]
From:[info]ketmar
Date:June 14th, 2018 - 01:10 am
(Link)
ебанина какая-то. продать мне её за тридцать секунд они не смогли — поэтому оно нинужна.
From:(Anonymous)
Date:June 14th, 2018 - 02:04 am
(Link)
Ты что не спишь, Киев... ночь.
From:(Anonymous)
Date:June 14th, 2018 - 02:09 am
(Link)
Ну ок, покопайся в кошеле - https://github.com/eosrio/simpleos
Найдешь закладки подбросят на харчи. В люди выйдешь.
[User Picture]
From:[info]ketmar
Date:June 14th, 2018 - 03:18 am
(Link)
я неинтересной мне хуйнёй могу согласиться заниматься только по стопроцентной предоплате, и без обязательства вернуть деньги если результат заказчику не понравится. при наличи кода на js цена автоматически умножается на десять. у них не хватит денег.
From:(Anonymous)
Date:June 14th, 2018 - 06:47 am
(Link)
просто не можешь. а накрутил с три короба, пиздунишка.
[User Picture]
From:[info]ketmar
Date:June 14th, 2018 - 07:13 am
(Link)
ok.
From:(Anonymous)
Date:June 14th, 2018 - 09:29 am
(Link)
Странно утверждать "не хватит денег" у кого бюджет почти не ограничен.
[User Picture]
From:[info]ketmar
Date:June 14th, 2018 - 02:27 pm
(Link)
если бы было так — они бы не побирались с народа, а давно бы наняли и программеров, и спецов по аудиту. FOSS пишут или идейные коммунисты, или нищеброды.
From:(Anonymous)
Date:June 14th, 2018 - 05:46 am
(Link)
гугл ебет въеб-дывелоперов в жопу большим черным хуем скачать без смс
https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
[User Picture]
From:[info]ketmar
Date:June 14th, 2018 - 05:48 am
(Link)
nobody cares here.
From:[info]phantom
Date:June 15th, 2018 - 06:09 pm
(Link)
А чо так сложно? Я обычно через char[] делаю. Ну, или ещё проще, bswap.
[User Picture]
From:[info]ketmar
Date:June 15th, 2018 - 07:39 pm
(Link)
потому что портабельно и без UB иначе не делается.
From:[info]phantom
Date:June 15th, 2018 - 08:14 pm
(Link)
Ну, используй uint8_t вместо char. И будет портабельно. Не пойму, в чём проблема.
[User Picture]
From:[info]ketmar
Date:June 15th, 2018 - 08:20 pm
(Link)
есть мнение, что для понимания можно попробовать пост почитать. там все многабукав как раз об этом.
From:[info]phantom
Date:June 15th, 2018 - 08:30 pm
(Link)
Прочёл ещё раз. Может быть, я чего-то не понимаю. К примеру, что такое, UB я нагуглил, а VRP уже хз.

Но моего мнения это не меняет. Давай я напишу, как я бы налабал, а ты покажи, что непортабельно в сниппете?
[User Picture]
From:[info]ketmar
Date:June 15th, 2018 - 08:35 pm
(Link)
VRP == value range propagation. что неважно, тащемта, потому что из контекста вполне понятно, о чём там речь.

а ещё там речь о том, что никакого другого метода сделать описаное, оставаясь в рамках стандарта си, тупо нет.
From:[info]phantom
Date:June 15th, 2018 - 08:59 pm
(Link)
Ну, давай конкретней:

#include 

using namespace std;

int32_t r4 (int32_t x) {
    const int n = 4;
    uint8_t* p = (uint8_t*) &x;
    uint8_t r[n];
    for (int i = n; i > 0; r[--i] = *(p++));
    return *((int32_t*) r);
}

int main()
{
    int32_t x = -13;
    cout << x << " --> " << r4(x) << " --> " << r4(r4(x)); 
    cout << "\n=0x... " << std::hex << (uint32_t) x << " --> " << (uint32_t) r4(x); 
    return 0;
}
[User Picture]
From:[info]ketmar
Date:June 15th, 2018 - 09:08 pm
(Link)
(вздыхает) какое из слов «…представление целых со знаком там не определено для отрицательных значений» вызывает затруднение с поиманием? поэтому весь твой код — полнейшая непортабельная хуета.
From:[info]phantom
Date:June 15th, 2018 - 09:17 pm
(Link)
Код, конечно, для ценителей Кернигана и Ричи, см. как копировать строки.

Ну да похуй. Давай конкретней, не понимаю твоей этой сентенции «…представление целых со знаком там не определено для отрицательных значений». Пруфлинк на номер секции в стандарте си, пожалуйста.
[User Picture]
From:[info]ketmar
Date:June 15th, 2018 - 09:21 pm
(Link)
извини, найдёшь сам, мне неинтересно. у нас тут беседа с позиции тех, кто читал стандарт и знает, почему там не определено переполнение интов, почему там не определено вдвижение в знаковый бит, и всё вот это. а если ты с этим не согласен — то и неси цитату из стандарта, где определяется формат представления знаковых целых.
From:[info]phantom
Date:June 15th, 2018 - 09:32 pm
(Link)
Ну, это по-еврейски, конечно, вопросом на вопрос. Я конечно, не читал стандарт, и не собираюсь, мне лень.

Но зайдём с другого конца. Ты вообще, что попросил? Сконвертировать BE в LE. Ты понимаешь, что это всего лишь побайтный реверс и похуй, какое представление используется на конкретной платформе? Комплемент-1, комплемент-2, signed magnitude, похуй. Мой код сконвертит всё, твоя же поебень обосрётся, например на signed magnitude.

Теперь покажи мне, и ещё раз прошу - конкретно, что в моём коде непортабельно.
[User Picture]
From:[info]ketmar
Date:June 15th, 2018 - 09:37 pm
(Link)
>конкретно, что в моём коде непортабельно
каст интового поинтера в uint8. всё, с этого места у тебя не код, а тыква. стандарт говорит, что единственный портабельный каст — это в `char`/`unsigned char`. который — по тому же самому стандарту — не обязан быть восьмибитовым.

то, что «все это делают» — совершенно не значит, что их код валиден по стандарту.
[User Picture]
From:[info]ketmar
Date:June 15th, 2018 - 09:40 pm
(Link)
p.s.: мой код тоже, кстати, с этой позиции непортабелен. но я честно заебался писать так, чтобы не нарушить ебаный стандарт — там всё будет ещё намного хуже.
From:[info]phantom
Date:June 15th, 2018 - 10:04 pm
(Link)
Читал статью в инете: один чел целый год следовал побуквенно библии. Начиная от не брить пейсы, или чего там, и кончая "не варить козлёнка в молоке его матери"... А, ну вот, нашлось: https://en.wikipedia.org/wiki/The_Year_of_Living_Biblically -- и это всеми воспринималось как курьёз.

У тебя это скорее из спортивного интереса, я так понимаю. Следовать стандарту си, это конечно, круто, и даже весело. Но и опасно: если ему действительно следовать, а не "писать как все", то оно работать не будет.

Я вот решил "не читал стандарта, и не буду" после этого: http://lj.rossia.org/users/superhuman/231901.html
[User Picture]
From:[info]ketmar
Date:June 15th, 2018 - 10:10 pm
(Link)
оно всё было бы так, но есть, сука, один нюанс. очень важный. ебаный gcc (и ебаный шланг тоже) оптимизирует код в предположении, что он написан в точном соответствии со стандартом, и НЕ СОДЕРЖИТ UB. поэтому он, например, может повыкидывать всякие проверки, которые вполне работают с точки зрения логики и CPU, но бессмысленны с точки зрения стандарта.
From:[info]phantom
Date:June 15th, 2018 - 10:33 pm
(Link)
Ну, и ладно, так даже веселей. У меня вот спорт наоборот был, когда генту разводил: сидел на тестовой ветке и всё, что мог, компилил с -О3 (а компилил я и гном, и кеды, и опенофис). Потом, правда, всё так сломалось, что не смог починить
[User Picture]
From:[info]ketmar
Date:June 15th, 2018 - 09:09 pm
(Link)
p.s.: это если не учитывать, что он вообще весь хуета, потому что у нас тут разговор о сишечке, а это не сишечка.
From:[info]phantom
Date:June 15th, 2018 - 09:14 pm
(Link)
Очень даже сишечка, протри глаза. Функция - чистый си, остальное вывод на экран для отладки.

Не хотел тебе грубить, но раз ты начал, то хуета - это твой код вверху постинга. Применим он только для n = 4, и тут аноним пробегал, он конечно нахамил, но я с ним согласен (пока что) насчёт реинтерпретов.
[User Picture]
From:[info]ketmar
Date:June 15th, 2018 - 09:18 pm
(Link)
1. это НЕ СИШЕЧКА. любой, кто считает, что кресты и сишечка один и тот же язык — идиот.
2. условие задачи написано в посте. его можно увидеть глазами и даже прочитать. у многих получилось.

если пост всё ещё не получается прочитать и понять (а у тебя явно не получается) — то не трать, пожалуйста, моё время на попытки сказать тебе точь-в-точь то же самое, что написано в посте, только в комментариях.
From:[info]phantom
Date:June 15th, 2018 - 09:36 pm
(Link)
Щас, слово за слово и посрёмся, хехе.

Ты делаешь вид, что дебил, или как софист, пытаешься в споре победить любыми методами?

Я зашёл в инет, нашёл первый попавшийся онлайн-компилятор, и это был с++. В функции r4 я использовал только c-конструкции. Я не использовал reinterpret_cast'ов, например,.. или покажи где там с++ в ней?
[User Picture]
From:[info]ketmar
Date:June 15th, 2018 - 09:39 pm
(Link)
стандарт си и стандарт крестов — два разных стандарта. отличающиеся — в том числе — и нюансами вроде представления типов. поэтому совершенно похеру, какие ты там конструкции использовал: C и C++ — два совершенно разных языка. C++ не является суперсетом C.
[User Picture]
From:[info]ketmar
Date:June 15th, 2018 - 09:43 pm
(Link)
p.s.: сорри, у меня сегодня… hard times типа. извини за наезды.
From:[info]phantom
Date:June 15th, 2018 - 09:52 pm
(Link)
Не страшно, тоже извиняюсь, однако.

Мы просто разговариваем на разных языках. Ты пытаешься следовать (в этом случае, как минимум) _букве_ закона, т.е. стандарта си. Портабельность для тебя - это портабельность в смысле стандарта.

Для меня портабельность, это когда оно работает на x86, x64, arm, plc всяких, скомпилированное пятью обычными компиляторами. И главное, чтобы код переписывать не надо. Также желательно, чтобы и для 4 байтов работало, и для 8, и .. для n, с минимальными изменениями.
[User Picture]
From:[info]ketmar
Date:June 15th, 2018 - 09:58 pm
(Link)
я, собственно, показываю, что стандарт уёбищен, а его авторы — дегенераты. и что такой стандарт не надо соблюдать, пусть он сдыхает. я, тащемта, и не соблюдаю. в частности и потому, что описаная в посте ебанина — далеко не единственная. благо, gcc всё ещё можно разминировать.
From:(Anonymous)
Date:June 15th, 2018 - 10:02 pm
(Link)
БЫДЛАН