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

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
// 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 j123123, (Updated )

Комментарии (96) 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 файлы можно было прям в код в комментарии вставлять в качестве иллюстраций? Типа вот написал ты алгоритм бинарного поиска, и туда еще рядом хуйнул в коммент видео с лекцией о том, как это работает и что вот там логарифмическая сложность. Заебись фича же!
        Ответить
          • Неважно, в стандарте такое тоже вполне можно запилить. Типа стандарт на то, что вот такой-то хренью можно встроить в коммент ссылку на видео
            Ответить
        • Или еще сделать чтоб ИИ в компилтайме прослушивал эту лекцию и на основе нее генерил код для бинарного поиска. И в разных компиляторах будут разные встроенные ИИ, некоторые при этом будут багнутый код генерить, и тогда надо будет лекцию фиксить. Программисты вместо программирования будут снимать лекции и встраивать их в код, а ИИ-компиляторы будет на их основе писать функции
          Ответить
          • Хотяб регекспы научили в компайлтайме компилиться?
            Ответить
            • в перле регекспе копуляца в копултайме, именно потому я за
              Ответить
        • С#: умеет, никто не суёт видео
          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, чтобы его нельзя было отредактировать просто так. Но делать такое на уровне метапрограммирования это как продолжение анекдота про молоток и гвозди
                  Ответить
                • > Ну во-первых ресурсы можно хранить отдельными файлами, возьми какую-нибудь игрушку на ПК - там контент разбросан по разным файлам, и игра их подгружает в случае надобности. Нахуй все это запаковывать в один бинарник?

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

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

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

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

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

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

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

                        Или инклудить код в код
                        Ответить
                        • > типа инициализируй мне вот такой-то массивчик байтиками из такого-то файла
                          Интересно, через сколько десятилетий после введения этой фичи в Комитете обратят внимание на новомодные веяния под названием «ресурсы» — ну типа вон как в двадцатом веке в «PE»-файлах придумали, с типизацией и упорядоченностью.
                          Ответить
                          • сударь, вы путаете мягкое теплым

                            ресурсы влинковывались в файлы, и в этом нет ничего дурного. Линекр может насрать сколько нужно секций, ведь по сути влинковывание порнокартиники ничем не отличимо от влинковывания статического кода

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

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

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

                            Нет, ты конечно можешь допустим написать некий интерпретатор байткода (FORTH например), и потом через эту крестодрисню инжектить байткод, и потом его интерпретировать. Но это, как ты понимаешь, отдельный случай
                            Ответить
                            • да, ты что-то не так понимаешь. в прогу надо будет засунуть темплейты для отчетов.
                              Ответить
                              • Ну ок, можете засовывать. Я вообще нихуя не знаю что там у вас в жабах принято куда засовывать, я пишу прошивки для калькуляторов контроллеров и на всякие там жабы и шарпы смотрю сами знаете как на что.
                                Ответить
    • Ещё с «Borland C» и «Borland Pascal» поставлялась программка «binobj.exe», которая из бинарника делала объектный файл, в котором объявлена публичная метка, чтобы его можно было прилинковать к программе и читать как массив.
      Ответить
  • Да и почему ограничились лишь чтением файлов? Давайте еще внедрим фичи чтоб файлы можно было записывать, удалять, создавать директории в компилтайме, и сокеты чтоб! Охуенно же, можно будет прямо в компилтайме спиздить какие-то файлы, или криптолокер запилить. Тогда антивирусным программам придется парсить крестоговно при проверке компа на компилтайм-вирусню, разве не охуенно?
    Ответить
    • Сокеты между джвумя компилируемыми файлами, чтобы они могли обмениваться метушнёй во время конпеляции.
      Ответить
      • Через сокеты в компилтайме в пределах одной машины это как-то анскильно, лучше shared memory в компилтайме. А через сокеты можно перебрасывать метушню если на нескольких отдельных компах компилировать одновременно, типа как OpenMPI какой-нибудь
        Ответить
    • Можно создать свои инпуты типа /dev/urandom с побочными эффектами, например:
      /dev/write/start - очистить буфер, и открыть буфер контента
      /dev/write/write/a - записать символ 'a' в буфер
      ... ну вы понели
      /dev/write/file - очистить буфер, и открыть буфер имени файла
      /dev/write/write/b
      /dev/write/write/a
      /dev/write/write/g
      /dev/write/write/o
      /dev/write/write/r
      /dev/write/write/dot
      /dev/write/write/t
      /dev/write/write/x
      /dev/write/write/t
      /dev/write/flush
      Ответить
      • Это же можно написать код, который скомпилицца только первые N раз. Что-то у меня нездоровые идеи пошли.
        Ответить
        • > Это же можно написать код, который скомпилицца только первые N раз.

          Это типа как trial версии, когда спустя N дней прога перестает работать (только тут прога перестает компилироваться). Какие инновации)))
          Ответить
      • Эх, только порядок вызова этих хуень наверняка не гарантирован.
        Ответить
      • о_О. Там ещё и запускать код можно? Я думал только дизасм смотреть...
        Ответить
      • Там даже есть галочка, чтобы в машинных кодах смотреть. В "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 байтика... Пиздец оптимизация, конечно.
              Ответить
              • Тут, скорее всего, дело не в оптимизации, а в том, что то самое поле, которое должно содержать указатель на расширенную часть экзешника, может содержать некорректные данные.
                Ответить
                • Ну я думаю парсер там вполне готов к любой некорректной хуйне.
                  Ответить
  • удобно делать повторяемые сборки

    сколько раз соберешь -- столько раз получится разный код!
    Ответить
    • "Ваш шанс получить уникальную программу, которой больше нет ни у кого в мире!"
      Ответить
    • У меня была материнская плата под 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ом, явно будет шандец.
            Ответить
              • Ширпотребовское — да. А какое-нибудь небытового назначения?
                Ответить
            • Оттого, что в луникс-кернеле что-то пропатчат, тип даты в прикладных приложениях не изменится. Нужно, чтобы производитель программы что-то исправил. Нужно, чтобы пользователь обновил программу. Пользователем, кстати, может быть организация с суровой бюрократией.

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

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

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

                Проснулся: а кругом пожарные суетятся.
                Ответить
  • Как в компиле тиме можно из "2 42 74 8 0 6" можно получить int[] = {2, 42, 74, 8, 0, 6}?
    Ответить
    • именно обычный массив так получить не получится, но какое-то крестоговно получить можно
      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];
      };

      примерно так
      Ответить
  • > Скажите им еще про миксины из D

    Ну как, сказали?
    Ответить

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

Семь раз отмерь — один отрежь, guest!

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


    8