1. Си / Говнокод #29120

    0

    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
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    #include <stdio.h>
    #include <stddef.h>
    #include <stdlib.h>
    #include <limits.h>
    
    int gcc_rtm_virt_test(int a, int(*f)(int, int(*)(), float*), float fa[static (-1,0,1)]) {
        short s = sizeof (short) + sizeof 0;
        char b[12] = "0123456789";
    
        for (long ll = sizeof b; ll -= 4;) {
            b[ll]   = '0';
            b[ll-1] = '1';
            b[ll-2] = '2';
            b[ll-3] = '3';
        }
    
        return s - ((1 << 2) - (b[0] - '2'));
    }
    
    int gcc_rtm_cf32(int(*f0)(), int(*f1)()) {
        ptrdiff_t d = f1 - f0;
        // guess you know what you're doing
        if (! (d >> sizeof (ptrdiff_t) * CHAR_BIT - 1)) { 
            while (d--) {
                switch(*(unsigned short*)(f0 + d)) {
                    case 0xc3c9:
                        return 0;
                    case 0xb8:
                        if (!*(unsigned int*)(f0 + d + 1)) {
                            return 1;
                        } 
                        break;
                    case 0xC031:
                        return 2;
                }
            }
            return -1;
        };
    
        return -2;
    }
    
    int main() {
    
        switch (gcc_rtm_cf32(gcc_rtm_virt_test, gcc_rtm_cf32)) {
            case -1:
                fprintf(stderr, "Hey, added smth. special? Maybe -Og? \n"), abort();
                break;
            case 0:
                fprintf(stderr, "Hey, -O0 smells like a dead rat.. check your flags!\n"), abort();
                break;
            case 1:
                fprintf(stderr, "Hey, -O1 is still not allowed.. Would you do better?\n"), abort();
                break;
            case 2:
                fprintf(stdout, "Hey, finally you've captured [-O2 || -O3 || -Ofast || -Os] flag!");
                break;
            default:
                fprintf(stderr, "Hey, looks like you've got impl. defined crap, check PTRDIFF_T stuff.. \n"), abort();
                break;
        };
    
    }

    И далее по тексту..gcc'шники опять обкурились в рантайме. Зачэм так делоть, это прикольно?

    Запостил: BCHARa, 10 Апреля 2025

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

    • Это, блядь, что, код для IOCCC?
      Ответить
      • ! (d >> sizeof (ptrdiff_t) * CHAR_BIT - 1) — это проверка на то, что d неотрицательно.

        А параметры функции gcc_rtm_virt_test — это вообще издевательство.
        Ответить
        • С - простой, интуитивно понятный язык погромирования
          Ответить
          • Указатели на функции даже в STL (std::function) легче читаются, чем в Си.
            Ответить
            • С нюансами. Отрапортуйте, когда читаемо и без костылей получите адреса конструкторов например
              Ответить
        • Ааа, точно, я приоритеты попутал,и подумал, что это рандомная какашка

          > параметры
          ага, сидел, пытался распарсить, а они нигде и не используются

          Какой багор )))
          Ответить
          • Может, сделано с расчётом, что компилятор, не совместимый с гцц, упадёт при попытке скомпилировать float fa[static (-1,0,1)] ?
            Ответить
            • к слову float fa[static (-1,0,1)] прекрасно cъедает clang, gcc, Intel. но не vc
              Ответить
              • Потому что наверное VC это C90? или это GCCшное расшырение,
                Ответить
                • нет, это же не какие-нибудь __attribute__.
                  static в массивах как индексация функциональных параметров появилась в С99 как вариант оптимизации, читай откупа разрабам компиляхторов. C явным "-std=c89" работает в gcc и шланге, в Intel строже - только с С99.
                  Это если мы только о а-ля x86 ширпотребе говорим..
                  Что интересно выдаст Texas Instruments например, а, господа микрушники?
                  Ответить
                  • Ну значит дело в том, что VC это С90.

                    Я когда-то носился с криками "А где в VC мои VLA??", ну и мне ответили, что твои VLA в C99, а VC это C90, и если хочется VLA, то иди в C++ (который VC как раз отлично поддерживает) и там тебе выдадут вектора.
                    Ответить
                    • Свежие версии «VC» уже довольно давно умеют минимум в «C17».

                      Но...
                      https://en.cppreference.com/w/c/compiler_support/99, «Cvr-qualifiers and static in [] within function declarations» — полагаю, это оно.
                      Ответить
                      • И VLA до сих пор нет, судя по таблице.
                        Ответить
                      • Права половина таблицы выглядит апиздато

                        PS: Если приспособить к жопе
                        компилятор фирмы Cray
                        Ответить
                        • Ты на таблицу поддержки C23 посмотри: официальный компилятор Cray поддерживает одну единственную фишку, а именно typeof, да и то «partial».
                          Ответить
          • Приоритеты неочевидны, да. Не прочитав документацию, не догадаешься, что сдвиги выполняются в последнюю очередь, даже после сложений и вычитаний.
            Ответить
        • Мы берем размер типа в байтах, и умножаем его на количество бит в байте. Получаем размер типа в битах. Вычитаем 1, и сдвигаем направо. Получаем true если самый старший бит был отрицательный, потому что так работает дополнительный код.

          Это хорошее, годное байтоебство. Такое байтоебство мы уважаем. Один вопрос только: AFAIK СИ обязан представлять отрицательные числа через доп код только с недавних пор, раньше мог иначе предоставлять. Значит ли это, что раньше этот код был бы неверн?

          Хотя шансы на иное представление отрицательных чисел примерно как на CHAR_BIT = 8
          Ответить
          • CHAR_BIT > 8 в некоторых компиляторах для DSP (digital signal processors) или для устаревших процессоров, у которых машинное слово не делилось на байты. Там CHAR_BIT легко может оказаться огромным, вроде 64 или 128.

            Сишка гарантирует, что оно не меньше 8.
            Ответить
            • верно и обратное, имеются некоторые занятные 7-битные железки, с которыми надо как-то работать. Зайдите например к Позитивам на чай, поинтересуйтесь.
              Ответить
              • Старый вариант стандарта требовал только, чтобы в char влезали все символы, которые есть в исходнике программы (латинские буквы, цифры, знаки препинания, переносы строк). Видимо, и семи бит было достаточно.

                Восемь бит стали требовать позже (в C99?).

                Интересно, было ли в какой-нибудь реализации меньше семи бит.
                Ответить
                • в доюникодно-хипстерские времена ASCII хватило 7 бит
                  Ответить
                  • Смотря кому. Последний бит позволял использовать вторую половину байта, которая часто использовалась для локализации. С866 и CP1251 и KOI8-R же
                    Ответить
                    • И знак и злак и на хую елдак


                      &gt; дою не кодно
                      До изобретения BOM
                      Ответить
                      • да, теперь тоже можно пососать

                        но самый главный посос конечно это cp1251. Вот буквально придумали граблю на пустом местпе
                        Ответить
                        • Там какое-то логичное обосснование было, чому лучше, чем 866. А какое обосснование, что подсчитать количество символов в строке теперь 0n? Или как это делает Мистер Сидор, 0n + 2n space, чтобы подсчитать количество слов, которое ну точно всегда равно кол-ву символов.

                          С этого и начался 64-битный бум.
                          Ответить
                          • 1251 ввели, потому что псевдографика в Винде не нужна (консоли в Win 3.x не было, точнее, была, но только для досовских программ, в отличие от OS/2 с полноценной консолью), значит, отказ от псевдографики позволит насовать символов типа «ёлочек», „лапок“ и прочей питушни™®©.

                            Странно только, что ради этого они символы кириллицы перенесли на новое место. Ведь могли же оставить на досовском.
                            Ответить
                            • Да я понимаю, зачем поменяли кодировку. Просто переезд кириллицы породил просто гигатонны багров. Представь себе времена Win95: половина софта под DOS, половина файлов под DOS, просто бесконечная боль и тлен для того, кто умеет в колировки. Shtirlitz же не просто так появился.
                              Ответить
                              • Я помню, как пытался людям, далёким от вычислительной техники, рассказать про кодировки и что им делать, чтобы они увидели текст, а не все эти кракозябры.

                                Если бы в MS оставили кириллицу на старом месте, то при выборе неправильной кодировки пользователь терял бы только кавычки и тире, а не получал бы «хую» вместо «его».
                                Ответить
                                • Кстати, я помню еще такой багор: в моей оче важной программе на поскале был конечно `Writeln('хуй');`, и вот в окошке винды он работал только если не развернуть его на весь экран. А в полноэкранном режиме были кракозябы. Угадаешь же проблему, да?
                                  Ответить
                                  • Ты русификатор для консоли не загрузил.

                                    В DOS с 6-й версии и в том, что встроен в 95/98/Me, была команда MODE CONSOLE CODEPAGE PREPARE (сокращённо MODE CON CP PREP), которой можно было загрузить шрифт для полноэкранной консоли. Некоторые почему-то по старой привычке ставили Кейрус (который тоже спас бы).
                                    Ответить
                                    • Да, всё так. На самом деле в config.sys еще была опция COUNTRY которая это делала по-умолчанию, но то-ли я ее оттуда убрал (потому что я срал конечно в любой файл, до которого мог дотянуться в то время) то-ли V86 его не загружал (что странно).
                                      Ответить
                                      • COUNTRY не для того: она чтобы апперкейс и лоукейс делать и чтобы дату красиво выводить. Это как переменная LANG в никсах.
                                        Ответить
                                        • да, напиздел
                                          DISPLAY.sys
                                          https://info.wsisiz.edu.pl/~bse26236/batutil/help/DISPLAYS.HTM

                                          вот он был жырнее кируса
                                          Ответить
                                          • Да, и командой mode можно было на лету менять шрифт, который грузит display.sys.
                                            Ответить
                                            • вот, теперь пазл сложилcя: чтобы работал mode -- нужно DISPLAY.sys, да?
                                              А я его вычистил склорее всего, и потому без кируса нихуя и не работало
                                              Ответить
                                              • Надо выбрать, а до того надо загрузить, а всё это делал display с поддержкой ega.

                                                А кнопки делал keyb.

                                                Всякие tsr делали и то и другое и были компактнее.
                                                Ответить
                                                • Всё так, да. Одна TSR против display + два вызова mode + keyb.
                                                  Ответить
                                                  • Моде не жалко, а остальные в памяти остаются.
                                                    Компактнее в смысле потом с этим жить, 640 килобайт не резиновые.
                                                    Ответить
                                          • Кстати, раз уж вспомнил про COUNTRY: если не указать COUNTRY=7, то неправильно будет преобразовываться регистр русских букв в некоторых досовских программах и, возможно, будут недоступны файлы и директории с русскими буквами в имени (ведь ФС регистронезависимая, значит, на каждый чих всё переводит в верхний регистр).

                                            Отсутствие такой строчки в config.sys приводило к баграм.
                                            Ответить
                                    • Что более лучше достаточно для каждого евривана, DOS или TRES?
                                      Ответить
                                  • У меня, кстати, ещё была видеокарточка EGA с прошитым русским шрифтом (плагин для БИОСа по адресу 0xC000 менял указатели на шрифты в основном БИОСе на свои). Я могу вообще класть хуй на русификатор (только клавиатурную раскладку загрузить).

                                    Причём прошит был тоненький шрифт ISO, а не жирный, к которому все привыкли.

                                    После перехода на SVGA пришлось снова следить за шрифтами.

                                    В вузе я видел кривые русификаторы, которые загружали шрифт не для всех видеорежимов. Например, 8x16 и 8x14 был, а шрифт 8x8 автор русификатора сделать забыл. Нахуя админы ставили такие русификаторы вместо штатной команды mode? Чтобы один килобайт оперативки сэкономить?
                                    Ответить
                                    • Keyrus (RIP, Дима) занимал меньше места, чем штатный русификатор для клавы плюс шрифт, а это было кажется важно чтоб экономить конвенционную память для игры в гоблины
                                      Ответить
                                      • На своём домашнем ПК я всё разрулил через QEMM, HMA, UMB. Я понял, что подавляющее большинство пользователей не умеет пользоваться QEMM, поэтому его ругает, как мартышка ругала очки.

                                        А так я понимаю, для чего нужен Кейрус: у него кроме РУС и ЛАТ была третья раскладка: для рисования рамок и прочей псевдографики. Прикольно же.
                                        Ответить
                                        • Был определенный скилл всё распихать по памяти, да. Но мне смутно помнится, что у меня всё равно было несколько секций (вариантов загрузки) в config.sys для разных нужд.

                                          В какой-то момент у меня вместо нормального SB оказалась Opti931, а ей нужен был драйвер. И еще сидирому драйваер и mscdex ебучий. И мыши драйвер. И руссификатор. И еще там всякого. И гоблины не влазили, и хуй.

                                          ps: memmaker помниш?
                                          Ответить
                                          • Ну так у меня тоже была куча драйверов. Сидиром был, звуковухи не было, но зато было много экзотических TSR.

                                            Пришёл к оптимальной конфигурации не сразу. Долго учился. Наконец, сделал так, что досовским программам стало доступно 635 килобайт памяти (ага, типа ДОС и все драйвера уместились в 5 кило).

                                            Ядро доса кинул в UMB, драйвера в UMB и в HMA. Нашёл драйвер мыши, который умел в cloaking (гы!): в V86 что-то перемещал в память защищённого режима.

                                            Самое главное — я отказался от процедуры «optimize» QEMM, которая что-то тестировала и трижды перезагружала компьютер. Она генерировала неоптимальную конфигурацию. Я же узнал про ключик /O, который ищет оптимальное место для драйвера при каждой загрузки и делает это быстрее, чем «optimize». Почему так, не знаю.
                                            Ответить
                                            • Я тогда не осилил, и вот у меня были секции в config.sys: для говнокодинга на борланде, для игры в игрушки, и пр.
                                              Я тогда сорта верхней памяти плохо понимал, разобрался только когда читал Гука:
                                              https://i.postimg.cc/4dX455Bv/image.png
                                              Ответить
                                              • Хорошая картинка.

                                                Из UMA вычитай:
                                                — Весь сегмент A000 (64К), если у тебя EGA/VGA/SVGA.
                                                — Полсегмента B800 (32К), если у тебя не MDA (если MDA, то полсегмента B000).
                                                — Выше C000 небольшие сегменты сожрут видеокарта и SCSI- и RAID-адаптеры (если есть).
                                                — E000 сожрёт окно EMS в память реального режима.

                                                Итого от UMA остаётся: 32К в B000, если у тебя не MDA; несколько кило в C000, если из 64К вычесть видеобиос (и другие внешние биосы); гарантированно 64К в D000.

                                                Негусто. Хорошо, что ДОС был маленьким.

                                                QEMM позволял в стелс-режиме выжать больше, но я не включал этот режим, поскольку считал опасным (там использовалась технология теневых блоков, и QEMM, чтобы решить, куда адресовать, к планке памяти или к другому железу, выяснял, кто запрашивает эту память).
                                                Ответить
                                              • EMS это вообще эмуляция экзотического контроллера памяти, который делал о'кошко с памятью в адресуемое просранство.

                                                Какое AWE )))
                                                Ответить
                                                • Да, была такая аппаратная питушня. Кажется, в слот ISA втыкалась. Как раз для того, чтобы поставить памяти больше, чем поддерживает процессор.

                                                  Ну а потом Лотус-Интел-Микрософт решили, а почему бы не смумулировать программно эту хрень, ведь теперь на борту оперативки много, а DOS её не видит.

                                                  Ценой чисто программной мумуляции стал перевод процессора в режим V86, иначе как-то тяжело маппить.

                                                  А XMS работает по-другому, у него нету окна, вместо него API для copy-paste оттудова сюда и обратно. На момент копирования (если сейчас не V86) он переключается в защищённый режим, а потом обратно.
                                                  Ответить
                                                  • Деды ебалися XMS, EMS, unreal mode
                                                    Отцы ебалися PAE, AWE
                                                    А нам досталися x64 и похуй пляшем
                                                    Ответить
                                                    • Unreal вживую не видел, кроме демки. Вероятно, его не использовали, потому что он несовместим с EMS, XMS, DPMI, а то и дело перезагружать комп ради одной программки — трата времени.

                                                      PAE и AWE — в каком-то очень серьёзном ПО использовались.

                                                      У 32-битного Watcom C помимо модели памяти Flat была ещё сегментная модель. Где реально использовалось, не знаю, но возможно, что как раз ради доступа к объёму сверх четырёх гигов.
                                                      Ответить
                                                      • PAE вполне себе использовалось в серверных виндах когда тебе нужно было больше 3 гигов, да и Линукс его умел.

                                                        Сам user mode софт, как ты понимаешь, мог быть и unaware, потому что это чисто заморочка менеджера виртуальной памяти. Причем это умели кажется только серверные винды.

                                                        А вот AWE было разве что в MS-SQL (может, в Exchange еще) потому что кому нахуй нужно хранить в памяти более четырех гигов?
                                                        Это вообще очень дохуя же. Было. В 2001-м году. Да.
                                                        Ответить
                                                        • Да, а сейчас только веб-браузер может сожрать гига четыре, особенно когда походишь по сайтам, напичканным ненавистным JS...

                                                          Про 3 гига и PAE помню. В Винде ещё надо было патчить ntoskrnl, если у тебя нет лицензии Ultimate или Premium. В лоховских лицензиях эта функция была заблокирована.
                                                          Ответить
                                                        • Многие мейнстримные языки до сих пор считают, что в памяти не нужно хранить много данных.

                                                          Угадайте, какой максимальный размер массива в ЯЖА?
                                                          Ответить
                                                          • Либо 64 килобайта, либо 4 гигабайта. Либо половина от указанного, поскольку в Йаже нету беззнаковых питухов.
                                                            Ответить
                                                            • je hebt gelijk.

                                                              В Яже размер массива измеряется в int*. Никаких тебе size_t и иже с ними. И конечно всё знаковое (беззнаковых типов в ЯЖА нет).

                                                              Мозги яжа программиста очень слабые, и чтобы их не повредить случайно, его избавили от всякой сложной программерской питушни.

                                                              *4 байта всегда на любой арзитектуре
                                                              Ответить
                                                              • А вот «PHP» проапгрейдили до 64 бит на 64-битных платформах. Теперь существует два «PHP»: с разными размерами целых питухов.

                                                                Беззнаковых тоже нету, но у массива могут быть отрицательные индексы, поскольку это и не массив вовсе, а ассоциативный массив.
                                                                Ответить
                                                              • Сам язык «Йажа» интересный: с одной стороны, он ротоёбский, с другой стороны, с явной статической типизацией.

                                                                Но вот реализация JVM и компилятора...
                                                                Ответить
                                                                • Кажется что "Go" тоже очень ротоебский язык, и тоже статический, не?

                                                                  Джава растет их Ынтерпрайза, а там обычно стат типизация.

                                                                  Скриптушня растет от волосатых юникс-хакеров.
                                                                  PHP это какой-то просто случайный экивок истории случился: в Perl ротоебов нет

                                                                  ЗЫ: джава язык очень тупой. Там всё влоб, и ничего нельзя. Любую задачувсегда можно решить достатиочным количеством бойлерплейта.
                                                                  Ответить
                                                                  • https://web.archive.org/web/20161208153348/соснули.рф/
                                                                    Ответить
                                                                    • сосули
                                                                      Ответить
                                                                      • Срезают лазером сосули,
                                                                        В лицо впиваются снежины.

                                                                        До остановы добегу ли,
                                                                        В снегу не утопив ботины?

                                                                        А дома ждёт меня тарела,
                                                                        Тарела гречи с белой булой;

                                                                        В ногах — резиновая грела,
                                                                        И тапы мягкие под стулом.

                                                                        В железной бане — две селёды,
                                                                        Торчат оттуда ложа с вилой.

                                                                        Есть рюма и бутыла с водой,
                                                                        Она обед мой завершила.

                                                                        Я в кружу положу завары,
                                                                        Раскрою «Кобзаря» Шевчены —

                                                                        Поэта уровня Петрары
                                                                        И Валентины Матвиены.
                                                                        Ответить
                                                              • Можно сделать свой массив, где внутри несколько массивов максимального размера
                                                                Ответить
                                                                • лишний индирект
                                                                  Ответить
                                                                • Не выполнится главное правило массива: данные не будут в нем последовательны, и не будет O(1) индексация
                                                                  Ответить
                                                                  • Будет О(1) индексация.
                                                                    Ответить
                                                                    • Кажется, что посчитать время доступа к 1-му элементу будет быстрее чем к девятимиллиардному, не?
                                                                      Ответить
                                                                      • нет, комплексити тот же самый, return elements[i / capacity][i % capacity], i любой
                                                                        Ответить
                                                                        • В джаве нет опкода для двумерного массива
                                                                          Ответить
                                                                          • а разница? мы про скорость доступа к элементу внутри такого массива, она не зависит от индекса, хоть там два опкода, хоть пять, хоть пятнадцать
                                                                            Ответить
                                                                          • Будет не O(1), а О(2)
                                                                            Ответить
                                                                            • ахаха
                                                                              сложность вашего алгроритма -- O(3,14)
                                                                              Ответить
                                                                            • Нет. Тебе же скинули код. Нудна 1 операция "/” и одна операция "%" (в процессоре это одна операция)
                                                                              Ответить
                                                                              • 1 и одна

                                                                                А сколько в вутекоде?
                                                                                Ответить
                                                                                • а как это влияет на то, что O от i не зависит и является константой?
                                                                                  Ответить
                                                                                  • Но в 2 раза сложнее, чем О(1)
                                                                                    Ответить
                                                                                    • блядь
                                                                                      Ответить
                                                                                      • Мне кажется, гость троллит.

                                                                                        Твое решение для случаев i &lt; 3G действительно чуть медленее, чем одномерный массив, но поскольку оно всегда одинаковое -- это O(1).

                                                                                        Другой вопрос, что оно не вмещает данных больше чем 4GB * 4GB, так что через через семьдесят его всё равно придется переписать на трёхмерный массив.

                                                                                        ЗЫ: оно напоминало мне как в MMU плодили уровни страничных таблиц с ровно с такой же целью
                                                                                        Ответить
                                                                                        • В MMU всё-таки гранулярность доступов и флагов на уровне страницы, страницы страниц, etc, etc., иерархия короч
                                                                                          Ответить
                                                                                          • Я не помню про гранулярность доступов на уровне страницы страниц, мне казалось всё таки оно на уровне страницы, но могу путать.

                                                                                            А еще можно заказать жырные страницы если у тебя памяти дохуя.

                                                                                            зы: ебаныестраницы убили сегменты: целый пласт культуры ушел псу под хвост
                                                                                            Ответить
                                                                                    • Сложность аппроксимируется выражением A*pow(n, k), где A и k — конь-станты.

                                                                                      Так вот 2*pow(n, 0) и 1*pow(n, 0) — это всё O(1), только A разное.
                                                                                      Ответить
                                                                        • >i любой

                                                                          правда? А если он указывает на элемент в районе 64 гигабайта?
                                                                          Ответить
                                                                      • Если эмулировать MUL через REP ADD
                                                                        Ответить
                                                                        • К слову, у 8080 не было MUL и DIV, на нём так и делали. У 6502 тоже не было.

                                                                          Трудно было писать мышиный кот под «Спектрумы» и под «Apple-II».
                                                                          Ответить
                                                    • Наполняем их йажаскриптом
                                                      Ответить
                                                    • Деды ебались, отцы ебались, а мы дрочим.
                                                      Ответить
                                                  • >А XMS работает по-другому,
                                                    по линии библиотекаря
                                                    Ответить
                                                    • Программисты-нормисы: Я знаю как прикрутить ChatGPT а нашему продукту чтобы принести пользу пользователям. За это мне дадут новый грейд, и плюс 20% к зп.

                                                      Я: ыыы, я знаю чем XMS отличается от EMS, и как подключали HDD к PC XT в 1986-м году, ыыыы
                                                      Ответить
                                                      • Я: соревнуюсь с Нидлессом в создании бинарников для ОС из 1980-х, которые можно набрать, пользуясь только печатными символами из ASCII.
                                                        Ответить
                                                      • > прикрутить балабобу, которая сначала напишет хуйню, а потом извиняется

                                                        Какая ELIZA )))
                                                        Ответить
                          • Ты про UTF-8? Да, у неё засада, как и в других MBCS (есть несколько китайских и японских кодировок с символами переменного размера).

                            Винда использует UTF-16. Если текст без иероглифов и без смайликов (которые используют пары суррогатов), количество символов считается мгновенно.

                            В UTF-32 вообще всё мгновенно считалось бы, но она слишком прожорлива: типичный текст без китайщины будет содержать много нулей.
                            Ответить
                        • > да, теперь тоже можно пососать

                          У тракториста?
                          Ответить
        • >int(*f)(int, int(*)(), float*)

          f это указатель на функцию, которая возвращает int. А получает она в качестве аргумента int и указатель на функцию, которая возвращает инт, а еще указатель на флоат
          Ответить
    • gcc_rtm_virt_test нужна, чтобы gcc_rtm_cf32 проверила склнпелированные в ней опкоды?

      Зачем проверять флаги компилятора таким поехавшим способом в уже скомпилированной программе?
      Ответить
      • Эта залупа ещё и привязана к штеуду:
        0xc3c9 — это LEAVE; RETN;
        0xb8 — это MOV RAX, константа;
        0xc031 — это XOR RAX, RAX.

        На других процессорах не сработает. Да и в компиляторе с другим кодогенератором, который не генерирует LEAVE (он ведь может сделать MOV RSP, RBP вместо LEAVE или вообще опустить «стекфрейм») или использует другие регистры, тоже.
        Ответить
        • https://godbolt.org/z/14s8ej5fq Однако эта дрянь для x86-32 на всей линейке древнего говна gcc исправно пашет, кроме транка. Как будто бы рабочий тест?
          Аффтар видать знатно раскурился: неплохой уан лайнер-выебоша !*(unsigned int*)(f0 + d + 1) ->> mov eax, 0 >> b8 00 00 00 00
          Ответить
        • зачатки эвристики прямо скажем "на двоечку". один volatile всё погробит к чертям своим esp. Где cwd*, проверка аккума на неявную возню с допрегистрами? Облагораживайте территорию, деревья сажайте.
          Ответить
          • Есть ещё разные call conventions, -mtune, -fomit-frame-pointer, -fstack-protector, -fstack-check, нестандартные сборки gcc с bounds checking или с «IBM Propolice» или ещё с какими-нибудь защитниками, которые испортят всю малину.
            Ответить
            • Я может быть сейчас спрошу какую-то глупость, но почему нельзя узнать версию компилятора у него самого, и так понять что он поддерживает?

              Или это нужно чтобы не таскать базу компиляторов за собой?
              Ответить
              • Можно узнать через встроенный псевдомакрос __GNUC__. Ещё можно узнать ключи, с которыми собрана программа:
                -frecord-gcc-switches

                Возможно, чтобы не таскать базу. Или для тяжёлых случаев вроде нового компилятора, которого нету в твоей базе.
                Ответить
                • Мне кажется это всё растет из тех времен, когда вот ты написал прогу, и хочешь чтобы она компилировалась на всех юниксах, а в каждом юниксе -- свой компилятор си, и про половину ты даже не знаешь.
                  Это всё реалии 1989-го года такие.

                  В 2025-м твоя програ компилируется скорее всего под три компилятора: clang, gcc и vc. И это еще тебе повезло, если под все три. Если ты пишешь на плюсах, то надо знать еще версию, потому что стандарт быстро менячется.
                  Ответить
                  • > Если ты пишешь на плюсах, то надо знать еще версию, потому что стандарт быстро менячется.

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

                    https://github.com/hanickadot/compile-time-regular-expressions/blob/aa31a2537e6563c1792e9bef0fe2be7122c4a8ee/include/ctre/functions.hpp#L34 например
                    Ответить
                    • https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88092

                      >I found that a type deduction placeholder in class nontype template parameter is not resolved properly if given as template argument to a class.
                      >
                      >GCC 9 HEAD (commit: 20f6624). Example attached with marked problem. Also found workaround using function template with a class nontype template parameter.

                      Именно поэтому я за Си. Там нет никаких "type deduction placeholder in class nontype template parameter"
                      Ответить
                • -frecord-gcc-switches хранит cmdline ключей после отработки бэка в какой-то из секций бинаря. её надо найти, распарсить..подходит не всегда.
                  зачастую ближе к ху*, когда нужна компактность - предпочтительнее проверка в runtime.
                  Справедливо не только для devtooling аля сборка, быдлокододегенерация, тесты, но и вполне промышленных, прости Господи, решений
                  Ответить
                  • И то верно, код для парсинга займёт больше места и тактов, чем код из данного говнокода.
                    Ответить
              • Потому что чемодан с ручкой это расизм.
                Ответить
            • Проверил, -fomit-frame-pointer действительно убирает leave при -O0.
              Ответить
              • vomit-frame-pointer :)

                Оставьте все в покое несчастный BP уже. Вам регистров мало что-ли на x64? Или вы хотите чтобы без символов вас невозможно было стектрейсы разбирать?
                Ответить
              • -march=i386 изменяет выхлоп не только -О0, но и -O1.

                В -O0 куча попов вместо leave, в -O1 реальные вычисления вместо mov eax, 0. Т. е. оптимизатор ломается.

                С -march=i486 такая же ерунда, как с i386, но появляется ebp.

                Только -O2 и более сильные оптимизации выдают неизменный выхлоп xor eax, eax.
                Ответить
                • Ну и говно же. -march=i386 и -march=i486 не должны ломать оптимизатор на -O1, ибо mov eax, 0 на этих процессорах присутствует, и оно явно быстрее длинных вычислений.

                  Почему же gcc обосрался? У них отдельный оптимизатор для этих архитектур вместо тюнинга основного оптимизатора?
                  Ответить
                  • P.S. Для тех, кто не понял: замена выражения на константу — это не микрооптимизация, а макрооптимизация, поэтому должна выполняться ещё на уровне языка, а не на уровне опкодов.

                    Почему же в gcc этим занимается кодогенератор?
                    Ответить
                • а когда завезли leave? в 16ти битном асме никакого лива не было
                  Ответить
                  • Был. Ещё ENTER был. Но на каких-то процессорах эта инструкция работала медленнее, чем mov sp, bp; pop bp, поэтому её не использовали.
                    Ответить
                    • не было в 8086/8088 никакого ENTER. Его в 186 завезли только.
                      Это значит он появился в AT (двойка), но в 5150 его не было.
                      Ответить
                      • Ясно. Значит, для совместимости с 8086/8088 не использовали.
                        Ответить
                        • А почему небыло?

                          Имхо:
                          Потому что в 8088 всем было похуй на языки выского уровня. Весь серьезный софт писался на асемблере, и передавал параметры через регистры.
                          Пуша и Попа тогда же поримерно появились


                          Хотя впринципе похуй конечно как он передавался, важно ято функции нужно было место под локалки, но может у тебя и локалки не локальными были
                          Ответить
                          • Кстати, из длинного режима 64-битки пушу и попу обратно изъяли. Просто регистров стало в два раза больше и сами они стали больше. Решили, что нерационально такой большой кусок съедать от стека. Оперативки, правда, тоже стало больше...
                            Ответить
                            • в 64 каловые конвенции таковы, что многое пхают через регстры: их много, и они большие. Смысла в пуше и попе стало немного/
                              Ответить
                    • P.S. С таймингами вообще было смешно: на некоторых процессорах LOOP был быстрее, чем DEC CX; JCXZ, на каких-то медленнее, поэтому для микрооптимизации приходилось туда-сюда менять с каждым поколением процессоров.
                      Ответить
                      • Фог целуюю книжку написал даже
                        Ответить
                        • Я кидал ссылку на Ralf Brown's Interrupt List. Там для каждого опкода были описаны баги на каждом процессоре и возможные воркэраунды.

                          F0 0F и FDIV — капля в море по сравнению с тем, что успел натворить Интел за свою историю.
                          Ответить
      • например вы делоете виртуалку и что-то в ней крутите
        Ответить
        • В скрипте configure, который генерируют autotools, подобных проверок море.
          Ответить
          • это когда он пытается угадать компилятор через посредство сборки хеллуворлда?
            Ответить
            • Так точно!
              Ответить
            • Die automake же модульное и детектит отдельные фичи.

              И вообще, если прямо так хочется, можно настрелять выхлопов кодогенератора и сравнивать с содержимым памяти *main
              Ответить
              • ну да, конкретные фичи компилятора, например поддерживает ли он C99 и пр. Это, собссно, главное зачем он нужен
                Ответить
    • А почему в свитче каждый раз бреак? Это особенность кода или магия компилятора?
      Ответить
      • эта дрянь вероятно не видела code review лет 20. Откуда магия, вы часом fallthrough у Георгия не объелись? break нужен только в "case 2:" и то, потому что за ним есть что-то. Остальные избыточны, т.к. abort() типичный _Noreturn.
        Спасибо, что без Duff's Device сегодня.
        Ответить
        • Вы наверное тут новичок, да?

          Дело в том, что doomginho (более известный как Уёбок, или Доктор Смегма) не разбирается в программировании. Он, по правде говоря, ни в чем не разбирается кроме педофелии и гомосексуализма, и потому комментирует случайные посты случайнами фразами.

          Отвечать ему тут считается тут дурной приметой, и он у всех в игноре.

          В данном случае он не спрашивал вас "почему не Duff?", он просто не знает, как switch в C работает.
          Ответить
          • Ты наверное новичок, да?

            https://govnokod.xyz/_28093/#comment-804730
            Ответить
          • Не нужно вводить новичка в заблуждение. Собственно, что ты собой представляешь, видно по твоей аве. Свинья.
            Ответить
    • тупой пыхокал, лол
      https://phpclub.ru/talk/threads/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B1%D0%BB%D0%BE%D0%B3%D0%B0.88142/page-13#post-782977


      по количеству ненужного кода пыхер уделывает джависта
      -&gt;withExceptions(function (Exceptions $exceptions) {
          $exceptions-&gt;render(function (RedirectException $e) {
                  return redirect()-&gt;route($e-&gt;getRoute(), ...$e-&gt;getParams())-&gt;with('error', $e-&gt;getMessage());
          });
      })



      сука, что в 2002-м, что в 2025-м: кал себе не изменяет
      &lt;a href=&quot;?action=full_article&amp;header_article="&gt;Читать далее</a>
      Ответить
    • кто понимает -- почему??
      https://pbs.twimg.com/media/GoajpbEXEAAHEdp?format=jpg&name=medium
      Ответить
      • Когда Путин сказал - тогда и полетел.
        Ответить
      • Ленин — полузащитник, играл за Ленинград.
        Ответить

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