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

    +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
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        bool b;
        cin >> b;
    
        switch (b) {
        case true:
            cout << "TRUE" << endl;
            break;
        case false:
            cout << "FALSE" << endl;
            break;
        default:
            cout << "WHAT???" << endl;
            break;
        }
    
        return 0;
    }

    Данный код с компилятором MSVC2017 64bit при вводе значения "true" (текстом) выводит в консоль "WHAT???"

    Запостил: mvngr, 30 Июля 2019

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

    • почему?
      Ответить
      • Потому что std::boolalpha выключен, видимо. И в переменной b остаётся неведомая хуйня, а это UB.
        Ответить
      • Мораль:
        - инициализируйте переменные
        - проверяйте флаги на стримах или включите исключения
        Ответить
      • Гипотеза: case true проверяет, что в младшем байте b лежит 00000001, в остальных байтах — нули (если sizeof(b) > 1); case false проверяет, что в b лежит ноль. Если в консоль ввести какое-нибудь слово, то в b попадёт какой-нибудь мусор, который не равен нулю и не равен единице.

        В общем, нужно сделать дамп сырого значения b, не приведённого к bool.
        Ответить
        • почему cin отработал, и ничего не сделал - это полная непредсказуемая хуйня
          Ответить
          • Он выставил на стриме флаг, на который тут забили хуй. Он даже мог бы кинуть исключение, если бы его об этом попросили.
            Ответить
            • Это должно быть по дефолту, имхо.
              Ответить
              • Вернись в девяностые (или когда там делали эти стримы) и поправь.
                Ответить
                • http://www.kasparov.ru/content/materials/201601/56A0DE5766917.jpg
                  Ответить
                  • Доступ к информационному ресурсу ограничен на основании Федерального закона от 27 июля 2006г. №149-ФЗ "Об информации, информационных технологиях и о защите информации".
                    Ответить
                    • там штук про доллары, которые бы он купил, оказавшись в прошлом

                      ты разве не умеешь обходить роском?
                      Ответить
                    • Рабсеянин рассуждает четотам про прокси, приватность, при этом сидит в чебурашке, лоооол.
                      Ответить
                      • хз
                        я хожу через впнку и теку
                        Ответить
                        • На меня почему-то роскомпозор не распространяется. Ни дома, ни с мобильным тырнетом
                          Ответить
                          • Брешешь.
                            Ответить
                            • Нет
                              Ответить
                              • мб ты не россияин?
                                Ответить
                                • Хуй знает. Оператор МТС. Кто может ещё проверить?
                                  Ответить
                                  • https://kavkazcenter.com/russ/content/2019/07/30/118318/general-vasilij-bogdan-rossiya-vyzhidaet-i-gotovitsya-k-polnomasshtabnomu-vtorzheniyu-v-ukrainu.shtml
                                    Приготовься соснуть с такой ссылкой и по landline и по celldata
                                    Томущо рашкованский чекистский "закон" всего лишь легализовал неофициальную блокировку КЦ
                                    Ответить
                                    • Ебать дебил. Твоё время ничего не стоит, что ты читаешь эту желтуху?
                                      Ответить
                                      • Слился со свободой слова? Так-то, пидорашка.
                                        Ответить
                                        • Ты думаешь я твою хуйню дальше заголовка прочитал?
                                          Ответить
                                      • Разумеется, семино время ничего не стоит

                                        он же нигде не работает
                                        Ответить
                              • Пруф давай, запусти OONI Probe и скрин сюда.
                                Ответить
                                • Нашёл у тебя за щекой pastebin, и запостил туда
                                  Ответить
                                  • Пидорашка загорелся как в Одессе, но продолжил сосать чекистский "МТС". Ясно.
                                    Ответить
                                    • сема, шел бы ты в peremogi.livejournal.com

                                      там вата как раз таких как ты хуями кормит

                                      сыт будешь
                                      Ответить
                                    • После инцидента с дрожью, который повторился в третий раз за месяц канцлер Германии Ангела Меркель изменила протокол церемонии встречи иностранной гостьи


                                      https://24tv.ua/ru/iz_za_drozhanija_merkel_izmenila_oficial nyj_protokol_n1178176
                                      Ответить
                                      • Наконец, «вáтник» – большой знаток геополитики. Значительная часть «вáтников» никогда не выезжала за пределы своей области и даже района, лишь некоторые посещали побережье Абхазии или Крыма. Но их познаниям в геополитике мог бы позавидовать и Збигнев Бжезинский, и Генри Киссенджер. Такие «вáтники» точно знают, что в этот момент думает Барак Обама, и могут подробно объяснить, почему Меркель боится Путина. Это самая большая пустота в мозгу «вáтника», в которой гуляет сильный сквозняк, способный разгонять любую геополитическую игру и поднимать ее на такую орбиту, с которой видно, как Кремль если не сейчас, то очень скоро станет властелином всего мира.
                                        Ответить
        • Всё так. От этого мусора ещё забавно && пидорасит. Вроде у тебя 2 true (в одном 3, в другом 4, к примеру). Но && возвращает false т.к. конпелятор оптимизнул его в побитовый.
          Ответить
        • > дамп
          Вангую, что там 0xCC, если отладочная сборка.
          Ответить
          • цц это чтобы если туда джампнуть то сразу в дебаг провалица?
            Ответить
    • А зачем вообще std::cin'у уметь считывать булевы значения? Они ж могут быть различными в разных программах: y/n yes/no on/off.
      Ответить
      • Я всегда считал, что boolalpha - это для няшного вывода в лог, не более того. Чтение, скорее всего, просто для симметрии запилили.
        Ответить
    • Добавлю, что MinGW на все некорректные данные (в т.ч. "true") выдает "FALSE" (что, в общем то, я и ожидал от MSVC). MSVC введенную цифру "2" уже шлёт в "WHAT???"
      Ответить
      • Если у тебя в коде UB (а он там есть), можешь выбрасывать все свои предположения на помойку. Там даже на одном конпеляторе может получиться разное поведение в зависимости от фазы луны и настроения.
        Ответить
      • Потому что mingw это порт gcc, а там sysv abi, где гарантируется, что булы представляются только как 0x1 или 0x0
        Ответить
        • Хотя возможно это может не соблюдаться для неинициализированной памяти (и по-моему на гк даже был пример, где в подобном коде gcc в default заходит)
          Ответить
        • В студии тоже гарантируется (и конпелятор сам пользуется этой гарантией, как и gcc).

          Пока ты не подсунешь в бул неинициализированное значение. После этого UB и уже никаких гарантий.
          Ответить
        • В данном случае либо стрелочка пишет 0, а не оставляет в переменной мусор, как msvc'шная реализация. Либо просто со значением мусора и/или оптимизацией свича везёт (возможно, что гцц выкинул свич и заменил его на иф в предположении, что бул может быть только 0 и 1).
          Ответить
    • Проверил одну из древних версий MSVC.
      b.cpp(20) : warning C4809: в операторе switch имеется ненужная метка "default";
      все возможные метки "case" уже заданы


      Переменная b всегда хранит либо ноль, либо единицу. Ветка с «WHAT???» у меня ни разу не сработала.

      Либо сломали в какой-то из новых версий, либо результат зависит от параметров компилятора.
      Ответить
      • В MSVC любая строка на входе, кроме 0, выдаёт TRUE (внутреннее представление b равно 1).

        В MinGW любое число на входе, кроме 0, выдаёт TRUE. Остальные же строки выдают FALSE.

        В обоих случаях мне не удалось в b поймать что-то, отличное сразу от нуля и единицы.
        Ответить
        • Внутреннее представление как выводишь?
          Ответить
          • Поскольку я не крестоблядь, наговнокодил так:
            int i = 0;
            memmove(&i, &b, min(sizeof(i), sizeof(b)));
            printf("%x\n", i);

            Совсем плохо, да?
            Ответить
            • Да норм, но я бы беззнаковый инт взял. Иначе это формально UB...
              Ответить
        • А вообще может быть в стандартной либе разница. Например раньше писали false в else а теперь только при 0.
          Ответить
        • Кстати, тут интересный момент в стандарте:
          - до с++11 стрелки не трогали переменную
          - после с++11 они должны писать в неё 0 (не ожидал, если честно)

          Т.е. MSVCбляди таки соснули и оно оставило мусор не по стандарту?
          Ответить
    • Ахах, русне теперь еще и на больничках ОРЗ будут переквалифицировать

      Минздрав планирует выписывать премии в размере 500 руб. врачам и медперсоналу, которым удастся обнаружить у пациентов онкологическое заболевание в ходе диспансеризации или профилактического осмотра. Общий размер расходов на эти премии составит ежегодно более 1 млрд руб. Прогнозируемое Минздравом число новых случаев злокачественных новообразований составляет ориентировочно 1,2 млн. То есть цифры статистики онкозаболеваемости в следующие два года могут удвоиться.
      Ответить
    • Переведи на "PHP".
      Ответить
    • https://upload.wikimedia.org/wikipedia/commons/9/96/Bayeux_Tapestry_WillelmDux.jpg


      тут написано

      c:\will\elm\dvx, или мне кается?!
      Ответить
      • Тебе кажется. Там после M двоеточие. Либо тут используются alternative data streams, либо это какая-то редкая система.
        Ответить
        • а, там
          c:\will\ell
          m:\dvx
          Ответить
          • Там hIC:VVILL\ELM:\DVX INMAGN/O:N

            Может быть, это MacOS Classic (которая была до OSX)? Там вроде были страшные пути.
            Ответить
            • P.S. Нет, я напутал. Там сепаратором было двоеточие:
              Macintosh HD:Documents:Letter


              А вот про «VMS» я правильно вспомнил: там сепаратором была точка, плюс вся цепочка директорий заключалась в квадратные скобки, плюс имя диска было с баксами:
              SYS$SYSDEVICE:[USER.DOCS]PHOTO.JPG;1


              Возможно, это какая-то муть вроде «AmigaOS»:
              Workbench:Utilities/MultiView

              Хотя нет, там слэши были не такими.

              Посмотри, какая прелесть ещё существовала: https://en.wikipedia.org/wiki/Path_(computing)

              Например, «TOPS-20» (как «VMS», только уголковые скобки вместо квадратных):
              PS:<USER.DOCS>LETTER.TXT,4

              Или «RSX-11» (как «VMS», только запятая в качестве сепаратора вместо точки):
              DR0:[30,12]LETTER.TXT;4

              Или «RISC OS»:
              LanMan::WindowsC.$.Pictures.Japan/gif

              Или «Stratus VOS»:
              %sysname#module1>SubDir>AnotherDir

              Или «Non Stop Kernel»:
              \NODE.$DEVICE.#SUBDEV.QUALIFIER
              Ответить
              • Хуясе, агностика слешей еще с OS/2 существует.

                Но я за CP/M без хуйни, разумеется.
                Ответить
                • Открою тайну: DOS тоже понимает оба слэша (проверял в MS-DOS 6.22, IBM PC-DOS 7.0, в DR-DOS нескольких версий, в PTS-DOS и ещё в каких-то).

                  Правый слэш в качестве сепаратора не работает только в стандартных утилитах и во встроенных командах «command.com», потому что они его воспринимают как начало параметра (например, встроенная команда DIR /P посчитает, что ей передали ключик «P», который означает включить пагинацию).

                  Во всех остальных случаях в DOS можно использовать хоть правый слэш, хоть левый.
                  Ответить
                  • > PTS-DOS
                    Эту мог бы не притаскивать, руснявая студенческая поделка спижженая из проекта Caldera OpenDOS. Если там такая семантика есть, то её скопипастили.

                    > DIR /P
                    А если DIR /PETUKH/CHICK*.???
                    Ответить
                    • >> Эту мог бы не притаскивать, руснявая студенческая поделка спижженая из проекта Caldera OpenDOS.

                      Нет. PTS-DOS написана с нуля, это экспериментальная система. В ней много несовместимостей с DR-DOS. В частности, она даже разделы дисков нумерует не в том порядке, в котором их нумеруют MS-DOS, PC-DOS и DR-DOS.

                      Возможно, PTS-DOS — говно, но она точно не спизжена.

                      >> А если DIR /PETUKH/CHICK*.???

                      Проверь. Более того, если напишешь слитно (dir/p), command.com тоже посчитает, что ты команде dir передал параметр /p. На современных виндах такое же поведение (и у cmd.exe тоже). Если тебе нужно запустить программу p, лежащую в поддиректории dir, нужно употреблять именно левый слэш: dir\p (надеюсь, хуз его не съел).

                      Так что директории, имена которых совпадают со встроенными командами, нельзя передать в command.com (и в cmd.exe) с правым слэшем. А вот в API DOS, OS/2 и Windows можно передать любой слэш. То есть fopen("dir/p", "r") в сишке откроет именно файл p из поддиректории dir.
                      Ответить
                      • Попов тоже говорил что изобрел с нуля, эспериментально и много несовместимостей с Маркони.
                        Ответить
                        • PTS-DOS — это олимпиадная поделка. Ты ещё скажи, что «олимпиадная» СУБД Вконтакте — это спизженная MySQL или MongoDB.

                          Caldera OpenDOS наследует все свойства DR-DOS. В частности, он многопользовательский. Файловая система для каждого файла сохраняет владельца и группу, как в никсах. В PTS-DOS ничего этого нет.

                          Ты всерьёз думаешь, что авторы PTS-DOS взяли исходники Caldera OpenDOS, изменили порядок нумерации разделов жёстких дисков, удалили владельцев файлов, удалили ещё кучу функций, свойственных DR?

                          Кстати, PTS-DOS появился в 1993 году, а Caldera OpenDOS только в 1996.
                          Ответить
                          • > 1993
                            Представляю, с каким остервенением ватник-апсирант качал эти сорцы с Compuserve! Ведь научный руководитель маститый проффесор Козломордин любил под боярку рассказывать, как он в НИИ Урюпинск-3 разрабатывал (деассемблировал PC-DOS на бумаге) Нейрон-ДОС.

                            https://www.youtube.com/watch?v=Z9YRvNa0yS4

                            > В PTS-DOS ничего этого нет
                            ARJ был битый и не скомпилилось
                            Ответить
                            • Если PTS-DOS с чего-то спизжен, то точно не с Caldera OpenDOS.

                              Ты ещё скажи, что «Ворд» собрали из спизженных исходников «Фотошопа», а самолёты собирают из спизженных деталей автомобилей.
                              Ответить
                              • Сука, остоебу. НЕ ОТВЕЧАЙ СЁМЕ.
                                Ответить
                                • Да я уже понял, что спорить с Сёмой — это как с голубем играть в шахматы: насрёт на доску и полетит своим рассказывать, как круто он меня сделал.

                                  Отвечаю только потому, что комментарии читает не только Сёма. Зайдут другие зрители, увидят, что что-то не так, и проверят.
                                  Ответить
                                  • Когда ватника ловишь на краже, ватник обычно немного покопротивляется и с темы соскакивает.
                                    Ответить
                                    • С темы соскочил ты. Я уже написал, что если PTS спизжен, то с чего-то другого, а не с DR. У них даже драйвер файловой системы различается настолько, что в PTS невозможно реализовать API владельцев файлов. И мультитаскера от DR в PTS нет, а ведь это тоже весьма интересная часть DR.

                                      Так что если PTS является плагиатом, то плагиатом какого-то говна, которое нам нужно найти, а не DR.
                                      Ответить
                              • А "gnome" собрали из спизженных исходников "gimp".
                                Ответить
                              • > не с Caldera OpenDOS
                                Ладно, буквоёб. В 1993 названия еще не было такого. Но Дурдос настолько часто менял вывеску, что нереально вычислить как называлось спижженое апсирантом.

                                > спизженных деталей автомобилей
                                https://www.youtube.com/watch?v=-gEm2bZaDwY
                                Ответить
                      • Нахуй ты ему отвечаешь? Не делай это.
                        Ответить
                    • P.S. При этом DIR > /PETUKH/CHICK отработает правильно, то есть перенаправит вывод в файл CHICK, лежащий в директории PETUKH, лежащей в корне текущего диска.

                      То есть / воспринимается как начало параметра только непосредственно после встроенных команд (типа DIR).
                      Ответить
                      • Это квирки встроенных команд, которых дохуя, самый ебучий из них `ECHO.`
                        Если для API пути идентичны, то да.
                        Ответить
                • я тоже за cp/m
                  и за первую версию доса

                  там не было этих сраных папок и соответственно и слешей не было
                  и все файлы легко было найти

                  ПАПКИ НИ НЕЖНЫ
                  Ответить
    • Почему сайты не пишут на пёрле?
      Ответить
      • пишут
        лайфджорнал, букинг.ком

        я знаю людей, которые живут в Амстердаме и на перле пишут booking.com.
        Ответить

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