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

    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
    void rtm_guard(void) {
        /*
            Don't even try to MS VC that stuff, zerobuffy 4eyes.
        */
        unsigned char buf0[0];
        unsigned a = 0xF001BA11;
        unsigned b = 0xF001BA11;
        unsigned c = 0x55550000;
        unsigned d = 0xF001BA11;
        unsigned e = 0xF001BA11;
        unsigned char buf1[0];
        ptrdiff_t diff = buf0 - buf1;
    
        const char* prnt;
        switch (diff) {
            case sizeof rtm_guard:
                prnt = "dear Nizhny Novgorod '-O1' lover";
                break;
            case sizeof (int):
                prnt = "'gcc -O0' bastard";
                break;
            default:
                prnt = "\b";
        };
    
        (diff == sizeof (int) || diff == sizeof rtm_guard) ?
        fprintf(stderr, "%s%s%s", 
                    "Hey you, ", prnt, ", what the hell are you trying to bang here w/o mandatory flags? Forgot something? \n"), abort() : 
        0;
    }

    Сodebomb в рантайме наложил. Но нафига? Присосаться хуком и послать курить джуника с лидом как рукопожато билдить?

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

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

    • Что делает этот кот? Тут разве не всегда дефолтная ветка исполняется?
      Ответить
      • Очевидно, что компилятор может оптимизировать a-e (и заэлайнить остаток?), и тогда разница будет в указатель
        Ответить
        • А "Nizhny Novgorod" тут при чём?
          Ответить
          • https://www.youtube.com/watch?v=GWOtDu1JrrQ
            Ответить
          • похоже кто-то намекает на ICC и его связь с НН офисом команды
            Ответить
        • В gcc получается минус адын:

          https://ideone.com/rnXBXJ

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

          В Шланге ноль почему-то:

          https://ideone.com/mw2w3V
          Ответить
          • В общем, нужно рассмотреть варианты, когда локалки размещаются снизу вверх и когда сверху вниз. Автор предусмотрел только последний вариант, а в gcc реализован первый.

            И нужно предусмотреть разные варианты выравнивания.
            Ответить
            • Он их может даже и в стеке не разместить)
              Ответить
              • Может, если на них никто не берёт указатель. Если явно взял указатель, их придётся разместить в стеке.
                Ответить
              • Кстати, нашёл результаты моего древнего расследования (надо повторить для актуальных версий и с разными флагами оптимизации):

                «Watcom, Digital Mars, LCC кладут локалки по возрастанию, как и глобалки.

                gcc, шланг, MSVC, Борланд, Pelles C кладут локалки по убыванию адресов.

                Ещё выравнивания локалок у разных компиляторов разные. MSVC и LCC любят выравнивать на 8 байт.»
                Ответить
    • как вообще на свете живет такое кривое создание как `sizeof(func)`? Это не UB овобще?
      Ответить
      • sizeof бывает для двух типов аргумента:

        1. Имя типа, например, sizeof(int). Здесь скобки обязательны.

        2. Выражение, которое не вычисляется, а только выводитмя его тип. В примере sizeof rtm_guard выводится тип, возвращаемый rtm_guard, в данном случае void, т. е. это эквивалентно sizeof(void).

        Заметь, что во втором варианте sizeof скобки можно опускать. Вот такая неочевидная фигня.
        Ответить
        • sizeof(void) это ошибка в си, потому что void incomplete type ж. В Gcc он равен 1, да. Но это -- нестандартное расширение
          Ответить
        • Следуя вашей логике, если бы rtm_guard возвращал например short или double, то sizeof (rtm_guard) стал бы 2 или 8? Но это не так. intel/gcc/clang/mingw - все еще 1, vc отфутболит.
          Ответить
          • Да, я ступил, тут же нет вызова. Тогда было бы sizeof rtm_guard()

            А был бы указатель, было бы sizeof &rtm_guard

            Тогда вообще непонятное выражение.
            Ответить
            • sizeof фнукции то же самое, что и инкомплит тайп. Еггог
              Ответить
              • В случае гцц 1
                Ответить
                • А нафига они единицу возвращают вместо ошибки? Это же маскирует говнокод, а практического смысла sizeof от инкомплит типа не имеет.
                  Ответить
                  • Х3 даже если вдруг для совместимости с древним говном, то один хрен всё ломается. Ни стена, ни пидантик нетзаставляют его кричать

                    Я понимаю, если сделали бы как sizeof(&fun), это хотя бы логично...
                    Ответить

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