Няшная / Говнокод #29120 Ссылка на оригинал

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

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

    • ! (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 как раз отлично поддерживает) и там тебе выдадут вектора.
                  Ответить
                    • И 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 же
                  Ответить
                  • И знак и злак и на хую елдак


                    > дою не кодно
                    До изобретения 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 в никсах.
                                      Ответить
                                        • Да, и командой 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 ротоебов нет

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

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

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

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

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

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

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

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

                                                                                      Твое решение для случаев i < 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://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


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



    сука, что в 2002-м, что в 2025-м: кал себе не изменяет
    <a href="?action=full_article&header_article=">Читать далее</a>
    Ответить
    • Когда Путин сказал - тогда и полетел.
      Ответить
    • Ленин — полузащитник, играл за Ленинград.
      Ответить

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

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

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


    8