1. Haskell / Говнокод #25323

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    doit({txs, [Tx]}) ->
        X = tx_pool_feeder:absorb(Tx),
        Y = case X of
    	    ok -> hash:doit(testnet_sign:data(Tx));
    	    _ -> <<"error">>
    		     end,
        {ok, Y};

    Прекраснейший код на Erlang из великолепнейшей криптовалюты AMOVEO
    Здесь мы видим эндпоинт для отправки транзакций в сеть, возвращающий в случае ошибки ["ok","ZXJyb3I="]
    Приглядевшись можно увидеть закодированное в base64 слово «error»

    Запостил: silvesterdrago, 24 Января 2019

    Комментарии (58) RSS

    • я помню на приатках wow, юзали какой-то аддон, для переноса персонажей с разных серверов. он собирал всю инфу о персонаже в таблицу. буквально всю: внешний вид, ачивки, голду, инвентарь, шмотки.
      вот эти долбоебы юзали base64 чтобы таблицу зашифровать. а аддоны то пишутся на луа. то есть, весь код открытый. ну вот у меня и появился таурен с ачивками за убийство Тралла :D
      Ответить
      • > зашифрованную
        > base64
        Помнится, на ГК кто-то проебал учётку из-за "зашифрованного" андроид студией пароля.
        Ответить
        • Кстати, что там утекло: пароль от «Яндекса»/«Гугла» или ещё от какого-то сервиса?
          Ответить
          • Пароль от тестового серта для проги под ведро.
            Ответить
      • >зашифровать
        >base64
        ахахаха
        Ответить
        • Ну путают люди термины «шифрование» и «кодирование». Подумаешь.

          В принципе, и «Base64» можно назвать шифрованием, только ключ всем известен («ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkl mnopqrstuvwxyz0123456789+/»).
          Ответить
          • >Ну путают люди термины «шифрование» и «кодирование». Подумаешь.
            Понятно.

            Это сообщение я зашифровал с помощью UTF-8.
            Ответить
    • Где здесь "Haskell", silvesterdrago?
      Ответить
      • Да что ты, все ж знают что "Haskell" и ``Erlang`` это почти то же самое
        Ответить
        • какаято нинужная функциональная хуня для математиков-тиоретиков

          настоящие программисты используют "PHP" и хаскелей этих вагших зне 3нают
          Ответить
          • Ну извините, я то думал, что здесь смешно то, что ответ об ошибке выглядит так же, как и успешный — ["ok", <base64 encoded tx_hash|error word>]
            Ответить
            • Вы, вероятно, в первый раз тут, да? Не знаете местных мемов?
              Ответить
            • Внимание! Произошла ошибка: "Операция завершена успешно."
              Ответить
              • Unexpected success.
                Ответить
                • System.ComponentModel.Win32Exception: The operation completed successfully

                  https://stackoverflow.com/questions/1209769/system-componentmodel-win32exception-the-operation-completed-successfully
                  Ответить
                  • Spurious interrupt.
                    Ответить
                  • Как же заебала эта «обработка ошибок». Вот бы в каком-нибудь языке не нужно было их обрабатывать! Точно был бы за этот язык![/​color]
                    Ответить
                    • ON ERROR RESUME NEXT
                      Ответить
                    • bat
                      Ответить
                      • Обработал ошибки в bat. Проверь.
                        cwsdpmi
                        fasm %1.asm
                        if errorlevel 1 goto :eof
                        %1
                        :eof
                        Ответить
                        • Как насчёт полиглота bat+asm, bat+com или asm+com?

                          Точка с запятой в COM-файле означает инструкцию CMP, точка с запятой и пробел —– это CMP SP, [BX+SI]. Таким образом, комментарий в асме может быть вполне валидным кодом в COM-файле.

                          REM в COM-файле –— это PUSH DX; INC BP; DEC BP. Пробел —– это AND (ожидается байт mod R/M). Комментарий в bat-файле тоже может быть валидным кодом в COM-файле.

                          Пока в мою петушиную голову никак не может прийти, как совместить ASM и BAT.
                          Ответить
                          • Напиши бинарь который представляет собой одновременно com-файл и исходник этого же com-файла на асме.
                            Ответить
                            • Мне кажется, что эта задача по сложности сопоставима с программированием на «Malbolge».
                              Ответить
                          • > совместить ASM и BAT
                            можно нахуярить программ с именами мнемоник. Так можно даже ассемблер сделать
                            Ответить
                            • > ассемблер
                              Набор com файлов, каждый из которых умеет конпелять одну инструкцию?
                              Ответить
                              • Ога. Можно на батниках, смещение и имя выходного файла хранить в пельменных окружения, сами батники дергают db, dw, dd и пр. (вот для них, наверное, придётся com-фалы делать, а не bat, чтобы писать не-аски байты и чтобы выражения считать), которые дописывают баты в файл.
                                Ответить
                                • Можно сделать 256 файлов с байтами. Тогда и db можно написать на батниках.
                                  Ответить
                                  • Но смещения считать-то как-то надо.
                                    Ответить
                                  • А ещё надо как-то dw, dd и пр. расщеплять на db. Но вообще можно и на батниках, но с каким-нибудь цальцулятором.
                                    Ответить
                                    • В батниках вообще что ли нет арифметики?
                                      Ответить
                                      • В виндовых точно есть, в досовских вроде нет.
                                        Ответить
                                      • C:\>set /a a="37*(3<<1)*(2^1)"
                                        666


                                        Ключ /A указывает, что строка справа от знака равенства является числовым
                                        выражением, значение которого вычисляется. Обработчик выражений очень
                                        прост и поддерживает следующие операции, перечисленные в порядке убывания
                                        приоритета:

                                        () - группировка
                                        ! ~ - - унарные операторы
                                        * / % - арифметические операторы
                                        + - - арифметические операторы
                                        << >> - двоичный сдвиг
                                        & - двоичное И
                                        ^ - двоичное исключающее ИЛИ
                                        | - двоичное ИЛИ
                                        = *= /= %= += -= - присвоение
                                        &= ^= |= <<= >>=
                                        , - разделитель операторов
                                        Ответить
                            • >> можно нахуярить программ с именами мнемоник

                              Я за. Для добавления новых инструкций (SSE, AVX, NEON, VFP) не нужно будет перекомпилировать ассемблер. Достаточно будет всего лишь добавить новых программ. Это настоящий unix-way!
                              Ответить
                        • >не нужно было их обрабатывать
                          Ответить
                          • Напомнило:
                            http://govnokod.ru/12089#comment159728
                            Ответить
                          • А как же их не обрабатывать? Вдруг конпеляция завершилась с ошибкой и осталась предыдущая версия программы, которая пидорасила систему?
                            Ответить
                    • В "PHP" не надо обрабатывать ошибки. Они доставляются пользовтаелю прямо в браузер в формате

                      Notice: undefined variable $razmer in /home/o/ochkolupof/kupitrusi.ru/index.php at line 3489

                      Именно потому я за "PHP"
                      Ответить
                      • Это фигня! Смотрите, как надо:
                        http://www.cmods-dev.de/

                        Верхнее серое полосатое поле нужно отмотать, дальше на белой плашке интереснее будет.
                        Ответить
                        • КАКОЙ БАГОР )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))
                          Ответить
                  • И начинается изба-гадальня. Большинство программистов под .net (как и вообще большинство пользователей винды) ничего не знают про свою ОС, и потому привыкли гуглить ошибки и выполнять все что там написано.

                    В итоге они три раза перезагрузились, зарегистрировали какие-то непонятные ком компоненты как им посоветовали на tomwhardware, поправили в реестре значение ключа с {9B723D37-FA2A-4491-8766-4AC054F2B811} на {9B723D37-FA2A-4591-8766-4AC054F2B811}, а ошибка все равно летит

                    подумывают переустановить винду и проверить на вирусы теперь
                    Ответить
                    • Это всё потому, что «Студия» у них «Express» или «Community Edition». Нужно «Ultimate» поставить, тогда всё исправится.
                      Ответить
                      • А теперь без сарказма. Видел, как чувак не смог скокококомпилировать свою программу на «Турбопаскале», потому что использовал плавающепитушиные типы данных double и extended. С типом real всё компилировалось, а вот с этими никак. Он сделал вывод, что это из-за того, что у него «Турбопаскаль» урезанный (самодельный репак на джвух дискетах). Искал полную версию, нашёл... и опять не компилируется.

                        А ларчик просто открывался: в исходник нужно было добавить директиву {$N+} (либо компилятор запустить с соответствующим ключом, либо в IDE указать в настройках проекта, но в исходнике как-то надёжнее). Выпилить поддержку плавающего питуха простым репаком нельзя, ибо она зашита в компиляторе и в модуле SYSTEM.TPU, без которого ничего не скомпилируется.

                        *****

                        А ещё Тарас троллил почтенную публику «Гейдева» вопросом, почему в его ассемблере сдвиг вправо есть знаковый и беззнаковый, а сдвиг влево только беззнаковый (ну точнее, знаковый якобы есть, но из-за какого-то бага компилируется в тот же опкод). Чуваки ему посоветовали достать полную версию компилятора.
                        Ответить
                        • Сдвиг влево доступен только в платной версии ассемблера
                          Ответить
                        • Питушня какая-то. А что на самом деле у Тараса было?
                          Операция сдвига влево принимает знаковость числа отдельным параметром?
                          Ответить
                          • Нашёл:
                            https://gamedev.ru/code/forum/?id=139163

                            Гуглится по простой фразе «tarasb shl sal».
                            Ответить
                          • Попробую объяснить. У сдвигов есть важное свойство: сдвиг вправо на один разряд делит число на двойку, сдвиг влево на один разряд умножает число на двойку. Хотелось бы, чтобы это работало и для положительных, и для отрицательных чисел.

                            Пример:
                            100 = 0x64 = 0b0110100;
                            50 = 0x32 = 0b0011010.

                            50 из 100 можно получить сдвигом вправо, 100 из 50 —– сдвигом влево. Освободившиеся разряды в обоих случаях заполняются нулями.

                            Теперь для отрицательных (в дополнительном коде, известном так же как two's complement):
                            -100 = 0x9c = 10011100;
                            -50 = 0xce = 11001110;

                            -50 из -100 можно получить сдвигом вправо с заполнением освободившихся разрядов единицами (т. е. слева как бы вдвигается бесконечная лента единиц).

                            -100 из -50 можно получить сдвигом влево (естественно, с потерей единиц, которые выезжают за пределы разрядности).
                            Ответить
                            • Теперь посмотрим на реализации в кокококомпиляторах.

                              В «Java» есть оператор >>>, который освободившиеся разряды заполняет нулями (беззнаковый сдвиг), и оператор >>, который в случае сдвига положительного числа так же заполняет освободившиеся разряды нулями, а в случае сдвига отрицательного числа заполняет освободившиеся разряды единицами (знаковый сдвиг).

                              Для сдвига влево в «Java» есть оператор <<, а вот оператора <<< нет.

                              В ассемблере для x86 есть беззнаковый сдвиг вправо (SHR), знаковый сдвиг вправо (SAR) и беззнаковый сдвиг влево (SHL). А вот знаковый сдвиг влево (SAL) компилируется в тот же код операции, что и SHL.

                              Вопрос: почему в «Java» нет оператора <<<, а в наборе инструкций x86 не различаются знаковый и беззнаковый сдвиг влево?
                              Ответить
                              • Это всё хорошо, но почему нет двух разных левых сдвигов?
                                В XX веке на командах решили сэкономить, чтоб вписать ОП-код с N бит?

                                Видно же, что в половине случаев ushl и sshl отличаются, как и ushr от sshr:
                                number     ushl(1)   sshl(1)
                                 u  s bin   u bin  M  s bin  M EQ
                                 0  0 0000  0 0000 +  0 0000 +  +
                                 1  1 0001  2 0010 +  2 0010 +  +
                                 2  2 0010  4 0100 +  4 0100 +  +
                                 3  3 0011  6 0110 +  6 0110 +  +
                                 4  4 0100  8 1000 +  0 0000 -  -
                                 5  5 0101 10 1010 +  2 0010 -  -
                                 6  6 0110 12 1100 +  4 0100 -  -
                                 7  7 0111 14 1110 +  6 0110 -  -
                                 8 -8 1000  2 0000 - -8 1000 -  -
                                 9 -7 1001  2 0010 - -6 1010 -  -
                                10 -6 1010  4 0100 - -4 1100 -  -
                                11 -5 1011  6 0110 - -2 1110 -  -
                                12 -4 1100  8 1000 - -8 1000 +  +
                                13 -3 1101 10 1010 - -6 1010 +  +
                                14 -2 1110 12 1100 - -4 1100 +  +
                                15 -1 1111 14 1110 - -2 1110 +  +
                                
                                number     ushr(1)   sshr(1)
                                 u  s bin   u bin  M  s bin  M EQ
                                 0  0 0000  0 0000 +  0 0000 +  +
                                 1  1 0001  0 0000 +  0 0000 +  +
                                 2  2 0010  1 0001 +  1 0001 +  +
                                 3  3 0011  1 0001 +  1 0001 +  +
                                 4  4 0100  2 0010 +  2 0010 +  +
                                 5  5 0101  2 0010 +  2 0010 +  +
                                 6  6 0110  3 0011 +  3 0011 +  +
                                 7  7 0111  3 0011 +  3 0011 +  +
                                 8 -8 1000  4 0100 + -4 1100 +  -
                                 9 -7 1001  4 0100 + -3 1101 +  -
                                10 -6 1010  5 0101 + -3 1101 +  -
                                11 -5 1011  5 0101 + -2 1110 +  -
                                12 -4 1100  6 0110 + -2 1110 +  -
                                13 -3 1101  6 0110 + -1 1111 +  -
                                14 -2 1110  7 0111 + -1 1111 +  -
                                15 -1 1111  7 0111 + -1 1111 -  -
                                
                                number - исходное число
                                *sh*(1) - сдвиг на 1 бит
                                u      - беззнаковое
                                s      - знаковое
                                l      - левое
                                r      - правое
                                M      - математическая корректность
                                EQ     - равенство *sh*, *sh*

                                Они что, воспользовались тем, что правые сдвиги различаются, по большей части, когда результат математически верен, а левые - только когда один из сдвигов неверен, и потому плюнули на консистентность команд и полноту области определения, прописали UB для математически неверных случаев знакового сдвига и сэкономили на ОП-коде?
                                Ответить
                                • То есть Тарас никого не троллил, это авторы компиляторов выкинули нужную операцию, просрали консистентность, усложнили написание кода - всё ради короткого номера команды в бинарном виде??
                                  Ответить
                                  • При сдвиге влево чисел, модуль которых превышает половину модуля числа Тараса (-63...-128 и 65...127 для байта, -16383...-32768 и 16385...32767 для 16-битного слова и т. д.) получаем арифметическое переполнение.

                                    Разработчики процессоров и компиляторов решили, что специальная операция с сохранением математического смысла (умножение на два) для таких случаев никому не понадобится. Старшие биты всё равно будут потеряны (мы и при беззнаковом сдвиге их теряем).
                                    Ответить
                                  • Умер он, бедный. Сел на трамвай до Питера.
                                    Ответить
      • Увы, erlang выбрать было нельзя, потому и указал во комменте.
        Ответить

    Добавить комментарий