Кресты / Говнокод #25741 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 mvngr, (Updated )

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

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

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

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

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

                                    сыт будешь
                                    Ответить
                                    • Наконец, «вáтник» – большой знаток геополитики. Значительная часть «вáтников» никогда не выезжала за пределы своей области и даже района, лишь некоторые посещали побережье Абхазии или Крыма. Но их познаниям в геополитике мог бы позавидовать и Збигнев Бжезинский, и Генри Киссенджер. Такие «вáтники» точно знают, что в этот момент думает Барак Обама, и могут подробно объяснить, почему Меркель боится Путина. Это самая большая пустота в мозгу «вáтника», в которой гуляет сильный сквозняк, способный разгонять любую геополитическую игру и поднимать ее на такую орбиту, с которой видно, как Кремль если не сейчас, то очень скоро станет властелином всего мира.
                                      Ответить
      • Всё так. От этого мусора ещё забавно && пидорасит. Вроде у тебя 2 true (в одном 3, в другом 4, к примеру). Но && возвращает false т.к. конпелятор оптимизнул его в побитовый.
        Ответить
        • цц это чтобы если туда джампнуть то сразу в дебаг провалица?
          Ответить
  • А зачем вообще 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 млн. То есть цифры статистики онкозаболеваемости в следующие два года могут удвоиться.
    Ответить
    • Тебе кажется. Там после M двоеточие. Либо тут используются alternative data streams, либо это какая-то редкая система.
      Ответить
        • Там 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.
                                    Ответить
                            • > не с Caldera OpenDOS
                              Ладно, буквоёб. В 1993 названия еще не было такого. Но Дурдос настолько часто менял вывеску, что нереально вычислить как называлось спижженое апсирантом.

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

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

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

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

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

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8