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

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
#include <stdio.h>
 
int main() {
   bool a = 0;
   printf("%d\n", sizeof(a)); // 1
   (*(char*)&a) = 'a';
   printf("%c\n", a); // говно, wtf?
}

Запостил: 3_dar 3_dar, (Updated )

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

        • Вероятно, защита от спамеров. Кому же захочется здесь что-нибудь рекламировать, если ссылки некликабельные?
          Ответить
          • я припоминаю что-то на эту тему читал. спамеры собирали на эту тему статистику: некликабельные линки всего лишь на 10-20% менее эффективнее чем кликабельные. IIRC содержимое сообщения имело большее влияние чем кликабельность линка.

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

              Кстати, ещё одна из причин, по которой владельцы сайтов запрещают ссылки: если количество исходящих ссылок в разы перевалит количество входящих, Яндекс может обнулить ТИЦ и понизить сайт в результатах поиска.

              *****

              А на любом сайте для программистов публиковать ссылки и правда опасно. Кто-то может не полениться и найти все дырки на рекламируемом сайте.
              Ответить
    • как говорится: "ЯП в bool"
      p.s. вообще, конечно, бул тут может элементарно тайпдефиться.
      Ответить
  • Без оптимизации выводит 'a', т. е. 'a' тупо копируется в ячейку, выделенную под bool с запасом.

    С ключами -O1, -O2 etc. компилятор сразу пишет в bool единицу, поскольку даже не предполагает, что в этот тип может поместиться что-нибудь кроме 0 и 1.

    Таким образом, в bool мы можем гарантировать значение только младшего бита.
    Ответить
    • Идея:
      #include <stdio.h>
       
      int main() {
        bool a = 0;
        (*(char*)&a) = 'a';
        char b = (*(char*)&a);
        if (b != '\1') {
          printf("Включите оптимизацию!\n");
        }
      }
      Ответить
      • Канпелятор слишком умный, даже memcpy(&a, "a", 1) превращает из:
        bool a = 0;
        memcpy(&a, "a", 1);
        std::printf("%c\n", a); // wtf?

        в
        .LC0:
                .string "%c\n"
        main:
                ; trololo
                movl    $1, %edx      ; ???
                movl    $.LC0, %esi
                movl    $1, %edi
                xorl    %eax, %eax
                call    __printf_chk
        Ответить
        • А если поставить "b" вместо "a", гцц копирует ноль, а не единицу. Гипотеза Борманда про ноль и не ноль не срабатывает.
          Ответить
    • > мы можем гарантировать
      Ничего мы не можем гарантировать, это UB, вроде как. По крайней мере я в стандарте не нашёл внутреннего представления була, на которое можно опираться.

      > младшего бита
      Скорее тупо 0 и не 0.
      Ответить
      • Если в стандарте нет, то жопа, потому что могут быть как минимум две реализации:
        1. Ноль и не ноль. Тогда 2 == true.
        2. Учитывается только младший бит. Тогда 2 == false.

        Получается, что писать любое значение, кроме true и false, это выстрел в ногу.
        Ответить
        • P.S. Я придумал более изощрённую реализацию була: проверять parity flag. Тогда 1, 2, 4, 7, 8 — это true, а 0, 3, 5, 6 — это false.
          Ответить
        • Погоди, 'a' = 97, там и младший бит 1, и !=0 тоже true. Поэтому неоднозначность может быть только если sizeof(bool) > 1 и мы пишем в старший байт
          Ответить
          • То есть для Вас, в отличие от Борманда, совершенно очевидно, что в любой реализации компилятора для любой платформы bool учитывает от числа только младший бит и неоднозначность может быть вызвана лишь порядком байтов в многобайтовом числе?
            Ответить
            • > что в любой реализации компилятора для любой платформы bool учитывает от числа только младший бит
              неочевидно
              > неоднозначность может быть вызвана лишь порядком байтов в многобайтовом числе
              очевидно
              Ответить
              • Планируется встреча обитателей этого сайта в баре
                Пойдешь?
                Ответить
                • Забей. Неактивных нет смысла звать, тем более с фаек. Они ни тебя, ни меня не знают, и никогда не согласятся.
                  Ответить
                  • Он плюсовик и есть на хабре
                    Так что в каком-то смысле я его знаю
                    Ответить
    • Знаю, что размер bool в C++ не регламентирован, но почему-то всегда думал, что sizeof(bool) == sizeof(int) в популярных компиляторах на популярных платформах (GCC на GNU/Linux включительно). Откуда у меня такое мнение взялось -- не могу понять.
      Ответить
      • Я пока не встречал реализаций, где sizeof(bool) не равен 1. Хотя Стандарт, безусловно, такое допускает.
        Ответить
        • Планируется встреча обитателей этого сайта в баре
          Пойдешь?
          Ответить

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

Где здесь C++, guest?!

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


    8