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

    +4

    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
    // https://godbolt.org/z/PPAWM0
    #include <embed>
    #include <cstdint>
    
    constexpr std::uint64_t val_64_const = 0xcbf29ce484222325u;
    constexpr std::uint64_t prime_64_const = 0x100000001b3u;
    
    inline constexpr std::uint64_t
    hash_64_fnv1a_const(const char* const ptr, std::size_t ptr_size, const std::uint64_t value = val_64_const) noexcept {
    	return (ptr_size == 1) 
    		? value : 
    		hash_64_fnv1a_const(&ptr[1],
    			ptr_size - 1, 
    			(value ^ static_cast<std::uint64_t>(static_cast<char>(*ptr))) * prime_64_const);
    }
    
    int main () {
    	constexpr std::span<const char> art_data  = std::embed("/dev/urandom", 32);
    	constexpr std::uint64_t actual = hash_64_fnv1a_const(art_data.data(), art_data.size());
    
    	return static_cast<int>(actual);
    }

    Очередная дрисня http://open-std.org/JTC1/SC22/WG21/docs/papers/2018/p1040r0.html в крестоговне, теперь можно через std::embed прочитать какое-то говно и даже в constexpr с ним что-то делать, например считать хеш-сумму. Можно constexpr-компилятор сделать, который бы читал код через std::embed и через constexpr хуиту его обрабатывал и компилировал. Скажите им еще про миксины из D

    Запостил: j123123, 10 Ноября 2019

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

    • Цитата из http://open-std.org/JTC1/SC22/WG21/docs/papers/2018/p1040r0.html
      > Every C and C++ programmer -- at some point -- attempts to #include large chunks of non-C++ source into their code.

      Если тупо нужно вклинить картинку в файл, можно обойтись и без этой хуйни. Можно объектник сделать из бинарника вот таким способом https://balau82.wordpress.com/2012/02/19/linking-a-binary-blob-with-gcc/

      А если хотите крестовыми констэкспрами обрабатывать байтики которые подгружены из файлов, то вам наверно к врачу надо
      Ответить
      • > Можно объектник сделать из бинарника вот таким способом

        Но можно ж встроить это в язык и не ебаться лишний раз?
        Ответить
        • А стоит ли встраивать в язык всякую такую поебень? Он не лопнет? Может еще сделать чтоб SVG и AVI файлы можно было прям в код в комментарии вставлять в качестве иллюстраций? Типа вот написал ты алгоритм бинарного поиска, и туда еще рядом хуйнул в коммент видео с лекцией о том, как это работает и что вот там логарифмическая сложность. Заебись фича же!
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • Неважно, в стандарте такое тоже вполне можно запилить. Типа стандарт на то, что вот такой-то хренью можно встроить в коммент ссылку на видео
              Ответить
          • Или еще сделать чтоб ИИ в компилтайме прослушивал эту лекцию и на основе нее генерил код для бинарного поиска. И в разных компиляторах будут разные встроенные ИИ, некоторые при этом будут багнутый код генерить, и тогда надо будет лекцию фиксить. Программисты вместо программирования будут снимать лекции и встраивать их в код, а ИИ-компиляторы будет на их основе писать функции
            Ответить
          • С#: умеет, никто не суёт видео
            JVM-поебень: умеет, никто не суёт видео
            PHP (PHAR): умеет, никто не суёт видео
            С++: лопаеца
            Ответить
            • > С#: умеет, никто не суёт видео
              > JVM-поебень: умеет, никто не суёт видео
              > PHP (PHAR): умеет, никто не суёт видео

              Что именно оно там умеет? Там в компилтайме можно допустим из встроенного видео взять такой-то кадр и сконвертить в JPG, байтики которого записать в массив? А в крестоговне это сделать вполне реально через эту хуйню, если переписать на constexpr-ы кодек для декодирования видео и конвертер в jpg.
              Ответить
              • потому что там нет понятия ресурса, и иначе с программой какой-то контент не поставить?
                Ответить
                • > потому что там нет понятия ресурса, и иначе с программой какой-то контент не поставить?

                  Ну во-первых ресурсы можно хранить отдельными файлами, возьми какую-нибудь игрушку на ПК - там контент разбросан по разным файлам, и игра их подгружает в случае надобности. Нахуй все это запаковывать в один бинарник?

                  Если вспомнить например X-COM: UFO Defence https://ru.wikipedia.org/wiki/X-COM:_UFO_Defense
                  > Игра проходит в двух режимах, стратегическом («Geoscape») и тактическом («Battlescape»). Как считает автор GameSpy, игра объединяет игровой процесс серии Gold Box с 4X-игрой типа Master of Orion, и в результате получается смесь двух значительно разных игр. Технически в версии для DOS оба режима реализованы как два независимых исполняемых файла, которые вызывают друг друга при переходе игрока из одного режима в другой.

                  Т.е. там фактически было два разных бинарника. И ничего, никто от этого не умер.


                  Во-вторых, ладно хер бы с ним, пусть включают бинарник в файл какой-нибудь директивой, ну типа
                  char somefile[] = @@INCFILE(somefile.bin);

                  Я против этого не возражаю, но мне это лично ничего не упрощает.
                  Но эти мудилы хотят этот файл обрабатывать в компилтайме крестовой constexpr метушней, вот это уже перебор.
                  Ответить
                  • Я запихивал текстовый файл в бинарь на go, чтобы его нельзя было отредактировать просто так. Но делать такое на уровне метапрограммирования это как продолжение анекдота про молоток и гвозди
                    Ответить
                    • Я не помню этот анекдот. Гуглится только про счёт за ремонт молотка.
                      Ответить
                      • P.S. Хотя, кажется, вот этот:
                        http://govnokod.ru/25239#comment447520
                        Ответить
                        • https://image.slidesharecdn.com/ifprogramminglanguageswereweapons-140901041817-phpapp01/95/if-programming-languages-were-weapons-10-638.jpg?cb=1409545251
                          Ответить
                  • > Ну во-первых ресурсы можно хранить отдельными файлами, возьми какую-нибудь игрушку на ПК - там контент разбросан по разным файлам, и игра их подгружает в случае надобности. Нахуй все это запаковывать в один бинарник?

                    чтобы поставлять это одним бинарником и не ебать мозг юзеру
                    Ответить
                    • Ага, а обновления не связанные с кодом (например обновления графики и музыки) будут патчить бинарник. Охуенно придумал. И мододелы будут довольны, надо будет распидорашивать бинарник, менять размеры каких-то секций и прочей хуйни, если захочешь новый контент впихнуть или заменить старый.
                      Ответить
                    • Тех, кто делает огромные бинарники, надо ебать в жопу стальным ломом. Они всё равно пидорасы, им понравится.
                      Ответить
                    • Ну и кстати если всю хуйню тупо впихнуть в один исполняемый файл, то у тебя возможно оперативки не хватит. Call of Duty: Modern Warfare (2019) например 175 GB на диске требует со всякими там текстурами и прочей дрисней, и если ты это все засунешь в файл как массивы - догадайся что будет.
                      Ответить
                      • По этому я в своих разработках лоадю все говно по мере надобности. И по мере ненадобнасти шлю в помойку уже отработаное. Лоадить естественно надо отдельными потоками. А то я знаю такие инди и не только. Которые либо не знают что надо свою дрисню загружать по мере надобности. Лобо знают но не знают что такое многопоток, ох же весело.

                        Поэтому я за lua.
                        Ответить
                        • Знаю одну индюшатинку, которая свои четыре гига ресов перед каждой загрузкой меню (начальный старт, каждый выход с сервера) грузит с ссд минуты по полторы… Я когда в первый раз увидел — натурально охуел.
                          Ответить
                          • показать все, что скрытоvanished
                            Ответить
                            • Там был прогресс-бар с надписью о загрузке ресурсов.
                              Ответить
                              • Интересно. Когда загружалось там были смешние записи как при загрузке в sims3?
                                Ответить
                                • Ох, миль пардон, я перепутал, надписи там нет, есть активное чтение с диска минуты полторы подряд. И, повторюсь, четыре гига суммарного веса.
                                  Ответить
                          • поэтому я против unity подобие. Забавно что там обучают долбоебы которые даже не знают как правильно программировать игры, хотя они и знакомы с программированием в целом. В целом конторы которые ведут обучалку только и зарабатывают этим. развод. Там лишь из сотни единицы думают. И получаем огромный генератор блядоигор которые именно работают как из жопы а не как 1 doom.
                            UE.
                            Насколько мне расказал знакомый, который думал где выбрать где разрабатывать игору. Посмотрел на UE, сказал что там на рендеринг такой жирнючий болт положили. Что в UE практически не возможно сделать песочницы, по типу майнкампфа. Зато зацените какой графоний, ну вы чего. В итоге знакомый плюнул на все эти движки и пошел свой писать на с++. Больше я его не видел.

                            другие движки не беру. Потому что блядогенератор в основном в этих "популиализированых" движков.
                            Ответить
                            • Точно! Индоговно на «Unity» вселило в меня стойкое отвращение к этой быдлоплатформе. Вижу заставочное окошко «Unity» (ну, то, в котором ещё предлагается выбрать графоний и разрешение экрана) — понимаю, что, с очень большой вероятностью, после него будет крайне кривое, тормозное и глючное поделие, написанное дегенератами, не отличающими «C» от «C++».

                              «JavaScript» от мира геймдева, чесслово.
                              Ответить
                          • Имя, сестра
                            Ответить
                            • «Blackwake», имото. Концепт, ИМХО, очень крут, а вот реализация сильно подкачала — глюки, баги и очень долгая загрузка.
                              Ответить
                              • Ох, пиздец, сколько блюра у них местами. Не видел такого года с 2010-го
                                Ответить
                                • Ага, главный бич индюшатины. Добавим мыла — получим крутой графоний!
                                  Ответить
                                  • Это скорее бич юнити. А юнити это уже, к сожалению, давным-давно бич гейдева. Вот такой вот говноуроборос
                                    Ответить
                              • да, я тоже возлагал большие надежды на игору под название "Kenshi".
                                в итоге разработчику просто она заебала, он решил бабос собрать и выпустил сырую игру как релиз и больше её не фиксит. Вот же гнида!
                                https://youtu.be/jKFKTkQKMf4
                                Ответить
                                • Вилы ему в сраку!

                                  Для BW фиксы подвозят, но какие-то… мелкие. И раз в несколько месяцев, да.
                                  Ответить
                      • Я не про колл оф дьюти, я про всякие консольные утилиты, которым часто нужна какая-то херота (тот же gradlew/gradle.jar например засунуть, или генератор отчетов, который на выходе дает хтмл-страницу). Которые весят по десятку мегабайт со всеми ресурсами.

                        Я не говорю, что всё всегда надо собирать одним бинарем, я говорю, что такая необходимость есть, и в вышеупомянутых языках она есть неспроста.
                        Ответить
                        • > тот же gradlew/gradle.jar например засунуть, или генератор отчетов, который на выходе дает хтмл-страницу)

                          Нет, ты не понял. Эта херота в крестах только данные вклинивает (типа инициализируй мне вот такой-то массивчик байтиками из такого-то файла). Код ты так не вклинишь. Для вклинивания кода тебе надо статически линковать.

                          Или инклудить код в код
                          Ответить
                          • > типа инициализируй мне вот такой-то массивчик байтиками из такого-то файла
                            Интересно, через сколько десятилетий после введения этой фичи в Комитете обратят внимание на новомодные веяния под названием «ресурсы» — ну типа вон как в двадцатом веке в «PE»-файлах придумали, с типизацией и упорядоченностью.
                            Ответить
                            • показать все, что скрытоvanished
                              Ответить
                              • Ну так я и веду к тому, что, коли эту фичу с std::embed введут, её будут усиленно абузить для встраивания в бинарник всяческих картиночек, музычек и прочего говна. А через много лет Комитет посмотрит на это говно и заговностандартизирует какую-нибудь говно в виде «std::embed_resource», повторяющее (криво, косо и многословно) то, что сейчас наблюдается в PE/jar/etc.
                                Ответить
                          • какой код? я тебе про ресурсы, ты мне про инклюды
                            Ответить
                            • Ну вот ты пишешь:

                              > или генератор отчетов, который на выходе дает хтмл-страницу

                              Если ты засовываешь какой-то генератор отчетов в свою прогу, то ты очевидно засовываешь какой-то исполняемый код, который эти отчеты генерит (или я что-то не так понимаю?).
                              А вот эта херня из крестов, о которой этот говнокод - она позволяет только вставлять данные, не код.

                              Нет, ты конечно можешь допустим написать некий интерпретатор байткода (FORTH например), и потом через эту крестодрисню инжектить байткод, и потом его интерпретировать. Но это, как ты понимаешь, отдельный случай
                              Ответить
                              • да, ты что-то не так понимаешь. в прогу надо будет засунуть темплейты для отчетов.
                                Ответить
                                • Ну ок, можете засовывать. Я вообще нихуя не знаю что там у вас в жабах принято куда засовывать, я пишу прошивки для калькуляторов контроллеров и на всякие там жабы и шарпы смотрю сами знаете как на что.
                                  Ответить
                      • Маппится в память только .text же
                        Ответить
                • Кстати в виндовых PE файлах есть отдельная хуйня для ресурсов http://cs.usu.edu.ru/docs/pe/dirs2.html
                  Ответить
      • Ещё с «Borland C» и «Borland Pascal» поставлялась программка «binobj.exe», которая из бинарника делала объектный файл, в котором объявлена публичная метка, чтобы его можно было прилинковать к программе и читать как массив.
        Ответить
    • Да и почему ограничились лишь чтением файлов? Давайте еще внедрим фичи чтоб файлы можно было записывать, удалять, создавать директории в компилтайме, и сокеты чтоб! Охуенно же, можно будет прямо в компилтайме спиздить какие-то файлы, или криптолокер запилить. Тогда антивирусным программам придется парсить крестоговно при проверке компа на компилтайм-вирусню, разве не охуенно?
      Ответить
    • показать все, что скрытоvanished
      Ответить
      • https://www.patreon.com/posts/running-your-on-27226279
        > To run your code, make sure you include an appropriate main() function, have the output window up, and then tick the ./a.out button!
        Ответить
        • о_О. Там ещё и запускать код можно? Я думал только дизасм смотреть...
          Ответить
        • Их пример ( https://godbolt.org/z/L83dUv ) в настоящий момент не компилируется.
          Ответить
        • Там даже есть галочка, чтобы в машинных кодах смотреть. В "ASCII" кодах, специально для нидлеса, нету.
          Ответить
          • Чтобы «gcc» высирал ASCII-коды, нужно для него собрать специальный бекенд.

            Есть бекенд «ia16», генерирующий 16-битный код реального режима для 8086 (модель памяти только «Tiny», как для com-файлов). Можно попробовать его доработать, чтобы он не отдавал опкоды за пределами ASCII.

            Есть готовый компилятор, генерирующий досовские экзешники, состоящие только из ASCII-кодов (модель памяти «Large», если не ошибаюсь):
            http://tom7.org/abc/

            Сам компилятор написан на языке «StandardML» (к сожалению, «OCaml» эти исходники не переваривает). Нидлес должен оценить.
            Ответить
            • Пример экзешника:
              http://tom7.org/abc/paper.txt

              Для веса в неиспользуемые участки вложили текст документации. Сигнатура ZM вместо MZ, чтобы «Windows» не тратила время на поиск расширенной части (PE или NE).
              Ответить
              • > не тратила время

                Прочитать один оффсет и сравнить 4 байтика... Пиздец оптимизация, конечно.
                Ответить
                • Тут, скорее всего, дело не в оптимизации, а в том, что то самое поле, которое должно содержать указатель на расширенную часть экзешника, может содержать некорректные данные.
                  Ответить
                  • Ну я думаю парсер там вполне готов к любой некорректной хуйне.
                    Ответить
      • показать все, что скрытоvanished
        Ответить
    • показать все, что скрытоvanished
      Ответить
      • "Ваш шанс получить уникальную программу, которой больше нет ни у кого в мире!"
        Ответить
        • Смех смехом, а так можно выпускать коммерческие программы, чтобы чужой серийный номер не подходил.
          Ответить
          • Подобную хуйню в IDA Pro делали (типа вотермарков) - https://sporaw.livejournal.com/88715.html чтоб было ясно чья версия утекла
            Ответить
    • показать все, что скрытоvanished
      Ответить
      • У меня была материнская плата под 80486 (сдохла из-за расслоения проводников во внутреннем слое) с «Award BIOS 4.5G» (не путать с «4.51PG»). Если поставить системную дату после 31 декабря 1999, то каждую полночь год сбрасывается на 2080 (или на какой-то другой, но я точно помню, что на нереальный). Разработчики не думали, что это говно доживёт до двухтысячного года. Я написал программу, которая считывает системную дату и меняет год на 2001. Прописал её в «AUTOEXEC.BAT». Это была моя первая программа на ассемблере. Занимала 15 байтиков. В следующем году выпустил апдейт этой программы: заменил 2001 на 2002.

        А потом у меня появилась другая материнка, и апдейты я выпускать перестал.
        Ответить
      • 2079
        The smalldatetime fields in SQL-Server databases will wrap around to January 1, 1900.

        2067
        ... all sound recordings fixed before February 15, 1972, will enter the public domain in the U.S.

        2038
        32-bit computer clocks overflow to represent the date as December 13, 1901.
        Ответить
        • > 2079
          > The smalldatetime fields in SQL-Server databases will wrap around to January 1, 1900.

          и ведь, сука, российские специалисты целой оравой будут бегать по всем стэковерфлоу, выясняя, что случилось.
          те, кто поумнее - еще в 2079, но и в 2080 найдутся
          Ответить
          • До 2079-го года ещё далеко. Ожидаются события поближе.

            2038-й год. Сломается весь софт, который хранит дату, как 32-битное смещение от начала UNIX EPOCH (1 января 1970).

            В частности, тип TIMESTAMP в «MySQL»:
            https://dev.mysql.com/doc/refman/5.7/en/datetime.html

            Никто не запрещает хранить дату в 64-битном числе (BIGINT) или в DATETIME (поддерживает даты до 9999 года), но ведь для этого нужно успеть проинспектировать софт и заменить все упоминания типа TIMESTAMP.
            Ответить
            • > 2038-й год. Сломается весь софт, который хранит дату, как 32-битное смещение от начала UNIX EPOCH (1 января 1970).

              Надо было дату в плавучих питухах хранить
              Ответить
            • >2038-й год. Сломается весь софт, который хранит дату, как 32-битное смещение от начала

              В луникс-кернел то и дело мерджат патчи. Может всё и не сломается.

              Но всяким андроидам (там до последнего времени было ядро 3.13) и "умному" китайскому ширпотребу, с vendor lockом, явно будет шандец.
              Ответить
              • Да и похуй, это железо и так до 2038 не доживёт.
                Ответить
                • Ширпотребовское — да. А какое-нибудь небытового назначения?
                  Ответить
              • Оттого, что в луникс-кернеле что-то пропатчат, тип даты в прикладных приложениях не изменится. Нужно, чтобы производитель программы что-то исправил. Нужно, чтобы пользователь обновил программу. Пользователем, кстати, может быть организация с суровой бюрократией.

                У приложения может быть архив с фиксированным форматом дат. Кстати, а в каком формате сейчас хранится дата создания файла в популярных архиваторах? Перейдя на новый формат, сломаем совместимость. Понадобятся конверторы из одного формата в другой.

                Да, андроидам и «умному» ширпотребу будет совсем плохо. Какие-то железки в один прекрасный момент могут превратиться в тыкву.
                Ответить
                • Купил умную сковородочку или кастрюльку, настроил по таймеру вариться.

                  Включил и лег спать. На дворе шёл 2к38.

                  Проснулся: а кругом пожарные суетятся.
                  Ответить
    • показать все, что скрытоvanished
      Ответить
      • именно обычный массив так получить не получится, но какое-то крестоговно получить можно
        template<char *S, size_t STR_SIZE>
        struct A {
            constexpr A() : arr() {
                for (size_t i = 0; i != STR_SIZE; ++i)
                    // tut kakaya-to krestodrisnya; 
            }
            int arr[STR_SIZE];
        };

        примерно так
        Ответить

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