1. C++ / Говнокод #28016

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    #include <stdio.h>
    #include <stdint.h>
    
    int main(void)
    {
    	bool a = 0;
    	*((uint8_t*)&a) = 2;
    	if(!a)
    		printf("a false\n");
    	else
    		printf("a true\n");
    
    	return 0;
    
    }
    
    ------
    .LC1:
            .string "a true"
    main:
            push    rax
            mov     edi, OFFSET FLAT:.LC1
            call    puts
            xor     eax, eax
            pop     rdx
            ret

    какой ID)))

    Запостил: digitalEugene, 15 Февраля 2022

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

    • а без оптимизатора все как и ожидается, a false
      .LC0:
              .string "a false"
      .LC1:
              .string "a true"
      main:
              push    rbp
              mov     rbp, rsp
              sub     rsp, 16
              mov     BYTE PTR [rbp-1], 1
              lea     rax, [rbp-1]
              mov     BYTE PTR [rax], 2
              movzx   eax, BYTE PTR [rbp-1]
              xor     eax, 1
              test    al, al
              je      .L2
              mov     edi, OFFSET FLAT:.LC0
              call    puts
              jmp     .L3
      .L2:
              mov     edi, OFFSET FLAT:.LC1
              call    puts
      .L3:
              mov     eax, 0
              leave
              ret
      Ответить
      • > а без оптимизатора все как и ожидается

        Можно поинтересоваться, откуда такие ожидания?
        Ответить
    • > ID

      UB на самом деле, эта хуйня с мусором в булеане на практике может настолько снести крышу, что у тебя true && true == false получится.

      Ибо конпеляторы обычно генерят битовый & вместо булевого &&. Засунул туда через жопу что-то кроме 0 или 1 -- ССЗБ.
      Ответить
      • ub там начинается с восьмой строчки, ой, ты это именно и написал
        Ответить
        • С седьмой, вообще говоря. В момент засовывания хуйни в бул через жопу.
          Ответить
          • я перепутал семь и восемь, у меня с цифрами не очень вообще. Собссно я и хотел написать, что нет никакой гарантии, что бул это uint8_t, хотя весть шанс, что бул это правда 8 бит в данном конкретном случае
            Ответить
            • Сонет


              Удивительный случай случился со мной: я
              вдруг забыл, что идет раньше — 7 или 8.
              Я отправился к соседям и спросил их, что
              они думают по этому поводу.
              Каково же было их и мое удивление, когда
              они вдруг обнаружили, что тоже не могут
              вспомнить порядок счета. 1,2,3,4,5 и 6 по-
              мнят, а дальше забыли.
              Мы все пошли в комерческий магазин «Гас-
              троном», что на углу Знаменской и Бассейной
              улицы, и спросили кассиршу о нашем недоуме-
              нии. Кассирша грустно улыбнулась, вынула изо
              рта маленький молоточек и, слегка подвигав
              носом, сказала:
              — По-моему, семь идет после восьми в том
              случае, когда восемь идет после семи.
              Мы поблагодарили кассиршу и с радостью
              выбежали из магазина. Но тут, вдумываясь в
              слова кассирши, мы опять приуныли, так как
              ее слова показались нам лишенными всякого
              смысла.
              Что нам было делать? Мы пошли в Летний
              сад и стали там считать деревья. Но дойдя в
              счете до 6-ти, мы остановились и начали спо-
              рить: по мнению одних дальше следовало 7, по
              мнению других — 8.
              Мы спорили бы очень долго, но, по сча-
              стию, тут со скамейки свалился какой-то ребе-
              нок и сломал себе обе челюсти. Это отвлекло
              нас от нашего спора.
              А потом мы разошлись по домам.

              12 нояб<ря> 1935.
              Ответить
              • Чуть только прокричал петух, Тимофей вы-
                скочил из окошка на улицу и напугал всех,
                кто проходил в это время по улице. Крестья-
                нин Харитон остановился, поднял камень и пу-
                стил им в Тимофея. Тимофей куда-то исчез.
                «Вот ловкач!» — закричало человеческое
                стадо, и некто Зубов разбежался и со всего
                маху двинулся головой о стенку.
                «Эх!» — вскрикнула баба с флюсом. Но Ко-
                маров сделал этой бабе тепель-тапель, и баба
                с воем убежала в подворотню.
                Мимо шел Фетелюшин и посмеивался. К нему
                подошел Комаров и сказал: «Эй ты, сало!» —
                и ударил Фетелюшина по животу. Фетелюшин
                прислонился к стене и начал икать.
                Ромашкин плевался сверху из окна, стара-
                ясь попасть в Фетелюшина. Тут же невдалеке
                носатая баба била корытом своего ребенка. А
                молодая толстенькая мать терла хорошенькую
                девочку лицом о кирпичную стенку.
                Маленькая собачка, сломав тоненькую нож-
                ку, валялась на панели.
                Маленький мальчик ел из плевательницы
                какую-то гадость.
                У бакалейного магазина стояла очередь за
                сахаром. Бабы громко ругались и толкали друг
                друга кошелками.
                Крестьянин Харитон, напившись денатурата,
                стоял перед бабами с растегнутыми штанами и
                произносил нехорошие слова.
                Таким образом начинался хороший летний день.
                Ответить
      • Сишка обычно в качестве true кладёт единицу (1 бит).

        Вижуалбарсик и Дотнет в качестве true используют минус единицу (все биты установлены), причём значение может занимать два или четыре байта.

        Об этом нужно помнить при реализации протоколов обмена информацией: сырые булевы значения никуда не отправлять и ни откуда не принимать, а конвертировать в байтики явно.
        Ответить
        • > сырые булевы значения никуда не отправлять и ни откуда не принимать

          Вспоминается история про mysql и проверку пароля, когда любой пароль подходил с вероятностью 1/256.
          Ответить
          • Нашёл. Дыра в MySQL была из-за того, что разработчики полагались на то, что результат вызова memcmp всегда укладывается в один байт, поэтому проверяли только младшие 8 бит:

            https://thehackernews.com/2012/06/cve-2012-2122-serious-mysql.html

            По стандарту memcmp возвращает int. Обычно она возвращает разность между первой парой байтов, которые не совпали. Как именно её считать, нигде не документируется. Просто не ноль означает, что данные не совпали.

            Даже в теории эта разность может быть в диапазоне от -255 до +255, если её считать как алгебраическую, что не влезает в диапазон signed char.

            Видимо, у авторов MySQL эта разность считалась как XOR, поэтому всегда влезала в 8 бит.
            Ответить
            • Если число из диапазона [-255; 255] обрезать до одного байта, то ноль там будет всего в одной ситуации. Т.е. оно на соплях, но держалось.
              Ответить
            • P.S. Результат +128 (число Тараса для signed char) как раз и будет приводить к ложному срабатыванию, если обрезать до 8 бит.
              Ответить
              • Приведи реальный пример: какие байты сравнивали и что получили.
                Ответить
                • Вы никогда не задумывались над таким парадоксом: тот, кто больше всех моется - он самый чистый или самый грязный?
                  Ответить
                • Реальные примеры гуглить лень, как и искать глючную сборку MySQL.

                  Если брать алгебраическую разность первых несовпавших байтов, то можно придумать такие примеры:
                  1. В одной из строк есть символы за пределами ASCII.
                  2. Строки не текстовые, а из двоичных данных. Например, сравниваются двоичные представления хэш-сумм.

                  Если первые несовпавшие байты равны 0x21 (восклицательный знак) и 0xa1, то разность второго с первым будет 0x80=128.
                  Ответить
                  • Да, там хешсуммы сравнивали. В этом и проблема. Поскольку там подмешивался рандомный челлендж, то прокатывал вообще любой пароль если достаточное количество раз его вбить.

                    > 128

                    128 != 0, проверка не пройдена. Покажи реальный пример различных байтов на которых получится 0.
                    Ответить
                    • Сравнивали хеш пароля с хешем того, что ввел пользователь, и рандома?:)
                      лол, чтобы так обосраца, надо быть.. ... ... мускулевцем
                      Ответить
                      • Да почему? Классический challenge response, когда сервер кидает случайные байтики для защиты от повторов, а клиент хеширует с ними пароль (или хеш пароля, не суть).

                        Обосрались они только в том, что результат memcmp() кастанули в BOOL (байт) и он обрезался. Нули стали получаться не только когда хеши реально совпали, а тупо с вероятностью 1/256.
                        Ответить
                        • означает ли это, что сервер знает плейнтекстовый пороль?

                          они результат сравнения кастанули в бул?
                          Ответить
                          • > в бул

                            Не в bool а в BOOL. С крестовым bool всё ок было бы. Да и с ! было бы всё норм.

                            > плейнтекстовый

                            Не знаю. Хеш скорее всего.
                            Ответить
                            • если хеш, то ок.

                              сишный BOOL это алиас для целого обычный, и потому по сути они сравнивали типа if (some_int) ?
                              Ответить
                              • if (some_int) - норм
                                if ((bool)some_int) - норм
                                if ((BOOL)some_int) - не норм

                                Вклинилась потеря информации посредине.

                                З.Ы. Это условный пример. Конечно там был более сложный код. Но суть та же.
                                Ответить
              • Ты про TarasBer?
                Ответить
        • > сырые булевы значения никуда не отправл
          Разве в дотнете принято маршалить сырые данные?
          Ответить
    • А уж если булы в битах хранятся, тогда непонятно, как адрес брать. Или bool* будет занимать больше места, чем обычный указатель (ну или часть адреса будет выделена под номер бита).
      Ответить
      • > ну или часть адреса будет выделена под номер бита

        На некоторых ARM'овских контроллерах есть окно в адресном пространстве, через которое видно кусок оперативки растянутый в 8 раз (каждый бит видно как байт). Вот в нём можно брать указатели на "биты".

        Правда х.з. зачем всё это.
        Ответить
        • Битоёбство для немогущих в побитовые операции.
          Ответить
          • Да, можно юзать std::tarasform для обработки битов.
            Ответить
          • А стандарт описывает, какой именно битик должен быть единичкой в тре?
            Ответить
            • Тре?
              Ответить
              • тру
                Ответить
                • Неа. Но преобразование его в инт должно вернуть единичку. Поэтому обычно она там и лежит.
                  Ответить
                  • Не нравится мне всё это. В C89 не было никаких булеанов.
                    Ответить
                    • Но там тоже была единичка в качестве труъ.
                      Ответить
                      • ага:) Но сущностей было меньше, и уважаемый Стив Браун не стал бы писать

                        [quote]
                        гда непонятно, как адрес брать. Или bool* будет занимать больше места, чем обычный указатель
                        [/quote]

                        Чем меньше сущностей -- тем лучше же
                        Ответить
                        • > гда непонятно, как адрес брать. Или bool* будет занимать больше места, чем обычный указатель

                          На х64 ты всё адресное пространство не используешь. Три бита для адресации индивидуальных битов в байте отжать можно.
                          Ответить
                          • Самое страшное - это когда человек имеет красивое лицо, а поговорить с ним не о чем
                            Ответить
                          • Ну отожми. Как, удобно работать?
                            Ответить
                          • Если у меня один бул, то ничего стращного. А если их много, то надо делать биотвую карту же: структуру с флажками
                            Ответить
                    • и в 45, а до берлина дойти это не помешало

                      именно поэтому я против «зумерского идиотобесия», понапридумывали лишних типов и сидят систему типов дрочат - вместо того чтобы программы писать
                      Ответить
                      • В (C)89 было будущее. А теперь его нет.
                        Ответить
                        • Дети - это будущие люди
                          Ответить
                          • https://img.artlebedev.ru/kovodstvo/idioteka/i/60E92F45-82DF-4071-B5D8-EA5677CECB65.jpg
                            Ответить
                            • Эх, а было время, когда актуально было раздумывать, а не мудак ли лебедев, или просто такой эпатажный гражданин.
                              Ответить
                              • Я еще застал времена, когда в сети вовсе не было мудаков. Ну то есть была пара троллей, но блогеры казались умными и интересными
                                Ответить
                                • Настоящий мужик превышает скорость и не закусывает, поэтому долго не живет
                                  Ответить
                                  • Все великие люди уже умерли, вот и я плохо себя чувствую
                                    Ответить
    • Всё таки пыхеры это альтернативная ветвь эволюции. Вот как неандертальцы это не сапиенсы, так и пыхеры вроде бы внешне похожи на программистов, но на самом деле они другие

      https://postimg.cc/rR9gcYCP
      https://postimg.cc/cK8pZ0Kk
      Ответить
      • Не забывайте выделять красным цветом слова, не образующие отдельные конструкции и не имеющие значения в изоляции от других.
        Ответить
        • Не стесняйтесь предварять идентификаторы знаком $ (как S)
          Ответить
      • Я видел много кода на «PHP», но я ничего не понял. У автора какое-то логопедическое заболевание.
        Ответить
    • https://www.youtube.com/watch?v=wMmVJo8S7II
      Ответить
      • Столетние крокодилы прикидываются бревнами и внезапно кусаются
        Ответить
      • ха-ха-ха посмотрите у него же ВИСЮЧИЙ ХУЙ вместо носа ха-ха-ха ха-ха-ха ой перемена кончилась
        Ответить
        • Красота не всегда самое важное качество человека, главное внутренность
          Ответить
        • Скажи "раз"
          Ответить
          • https://t.me/rbordunov/2108
            Ответить
            • Вот вы любите путешествовать без мужа, а как же фильм "Любовь и голуби"? Он вас ничему не научил?
              Ответить
            • Я не пользуюсь телеграмом, я же не пидор
              Ответить
              • но джаваскриптом-то пользуешься
                Ответить
                • эу, слыш, папа твой джавскриптом пользуется, понял??
                  Ответить
                  • Посмотрю кем ты будешь, когда все твои коллеги на него пересядут, и нужные тебе чаты будут только там. Ахах.
                    Ответить
          • Скажи "клей"
            Ответить
            • Я рад, что обогатил твой кругозор этой историей из моего детства
              Ответить
    • bool a = false;
      *((uint8_t*)&a) = 2;
      printf("%d\n", a);
      Лол. UB такой UB.
      Ответить
    • Тест неправильно написан.
      Должно быть:
      if(!a)
      	printf("a false\n");
      if(a)
      	printf("a true\n");

      Так намного веселее
      http://coliru.stacked-crooked.com/a/ae6506c90f86b938
      Ответить
      • Самое смешное, что оно работает даже на О0. Шах и мат, любители "предсказуемых" дебажных сборок.
        Ответить
        • Оно работает только на О0. С оптимизацией компилятор осознаёт, что бул должен быть либо истинным, либо ложным, и решает, что сегодня 2 — истинно.
          Ответить
          • https://ideone.com/RRJMbf

            Fuck the logic.
            Ответить
            • Inverted NaN is still a NaN
              Ответить
              • NaB
                Ответить
              • Это гиперкомплексные взаимно-ортогональные булеаны.

                true2 && true2 и true4 && true4 истинны, но true2 && true4 ложно.
                Ответить
                • Моя жена не верит, что я ездил с подругой в Таиланд понырять чисто по-дружески
                  Ответить
          • > бул должен быть либо истинным, либо ложным

            Волновая функция коллапсирует. И если мы измерили x как истинное, то !x будет ложным и наоборот. Вроде всё ок.
            Ответить
        • > предсказуемых

          Хотел получить хуйню - предсказуемо получил.
          Ответить
          • Роды принимать, наверно, интересней, чем зубы вырывать. Правда, я не пробовал
            Ответить
      • Так вот почему в JS принято писать if(!!a) ...
        Ответить
        • Тут не поможет
          if(!!a)
          	printf("a really true\n");
          if(!!!a)
          	printf("a really false\n");

          http://coliru.stacked-crooked.com/a/d989d30ddb1cdd1b
          Ответить
          • Что же тогда делает оператор ! ? Инвертирует младший бит?
            Ответить
            • Ну да. Раз бул у нас 0 или 1, то логично запилить ! как xor с единичкой. && и || он заменяет на & и | т.к. код короче получается, а разницы нету. А проверка истинности это обычно "ноль" и "не ноль".
              Ответить
              • При выступлениях я краснею. Сначала я волновалась по этому поводу, но потом поняла, что если ты говоришь связно и интересно, слушателям всё равно, какого ты цвета
                Ответить
    • кстати помню читал статью, компилятор C за n дней вроде бы, там автор сталкивался с проблемой того что он проверял булы наивно, из-за этого когда он пытался запустить скомпилированный его компилятором gcc в каких то циклах дополнительные итерации проходили и всё падало.
      Ответить
      • Хоть меня и зовут Лев, но когда я говорю перед публикой, то превращаюсь в зайца
        Ответить
        • Фанаты бывают разные: бывают фанаты хоккейного искусства, бывают футбольного
          Ответить
          • Такие девушки, как Ольга, уже давно надоели Онегину, да и Пушкину тоже
            Ответить
            • Они ебали шкур на пару, в два смычка?
              Ответить
              • Прочитал как, «на па ́ру».
                Ответить
                • Дружба между мужчиной и женщиной возможна, но до первой пьянки
                  Ответить
                  • Интересно, а что будет после?
                    Ответить
                    • В моей крови течет много народов
                      Ответить
                      • Сигарета - это грязная вонючая соска для того, чтобы заразиться раком
                        Ответить
                    • После пьянки он напьется как свинбя, и у него не встанет, или он заснет прямо на ней. Ну и какая тут дружба после этово?
                      Ответить

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