1. C++ / Говнокод #18847

    −11

    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, 11 Октября 2015

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

    • По мотивам http://govnokod.ru/18843
      Где мое говно?
      Ответить
      • Напомнило: http://www.sramo.ru/pic/1395230955304.jpg
        Ответить
        • Херь какая-то.
          Ответить
        • Почему на говнокоде ссылки не кликабельны?
          Ответить
          • Вероятно, защита от спамеров. Кому же захочется здесь что-нибудь рекламировать, если ссылки некликабельные?
            Ответить
            • я припоминаю что-то на эту тему читал. спамеры собирали на эту тему статистику: некликабельные линки всего лишь на 10-20% менее эффективнее чем кликабельные. IIRC содержимое сообщения имело большее влияние чем кликабельность линка.

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

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

                *****

                А на любом сайте для программистов публиковать ссылки и правда опасно. Кто-то может не полениться и найти все дырки на рекламируемом сайте.
                Ответить
        • Битая картинка.
          Ответить
    • Здесь C++ в bool?
      Ответить
      • как говорится: "ЯП в bool"
        p.s. вообще, конечно, бул тут может элементарно тайпдефиться.
        Ответить
        • Какой тайпдеф для plain C при копировании оставляет от числа только один бит?
          Ответить
          • P.S. Битовые поля не помогают. Копирование заполняет даже анонимные биты.
            Ответить
          • typedef _Bool bool;

            http://ideone.com/CG6ey8
            Ответить
            • Тогда получается, что C++ здесь нет?
              Ответить
              • Если код приведен полностью - то это кресты, если не полностью, то может быть и сишечка.
                Правда можно ещё в stdio.h поднасрать :)
                Ответить
                • Ещё можно поднасрать в команду вызова компилятора:
                  gcc -Dbool=_Bool hello.c
                  Ответить
                • Набираем:
                  #include stdh
                   
                  ntmn() {
                     bool a = 0;
                     prntf("%d\n", szf(a));
                     (*(chr*)&a) = 'a';
                     prntf("%c\n", a);
                  }


                  Конпелируем:
                  gcc "-Dstdh=<stdio.h>" -Dbool=_Bool "-Dntmn=int main" -Dchr=char -Dprntf=printf -Dszf=sizeof hello.c


                  ВПЗД ПРГМРВАНЕ
                  Ответить
    • Без оптимизации выводит '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 в C++ не регламентирован, но почему-то всегда думал, что sizeof(bool) == sizeof(int) в популярных компиляторах на популярных платформах (GCC на GNU/Linux включительно). Откуда у меня такое мнение взялось -- не могу понять.
        Ответить
    • я думаю в ECMAScript есть решение
      http://govnokod.ru/18828#comment300167
      Ответить

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