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

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

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

  • Что делает этот кот? Тут разве не всегда дефолтная ветка исполняется?
    Ответить
    • Очевидно, что компилятор может оптимизировать a-e (и заэлайнить остаток?), и тогда разница будет в указатель
      Ответить
        • В общем, нужно рассмотреть варианты, когда локалки размещаются снизу вверх и когда сверху вниз. Автор предусмотрел только последний вариант, а в 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, да. Но это -- нестандартное расширение
        Ответить
        • Значит, будем считать implementation defined.
          Ответить
      • Следуя вашей логике, если бы rtm_guard возвращал например short или double, то sizeof (rtm_guard) стал бы 2 или 8? Но это не так. intel/gcc/clang/mingw - все еще 1, vc отфутболит.
        Ответить
        • Да, я ступил, тут же нет вызова. Тогда было бы sizeof rtm_guard()

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

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

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

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

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


    8