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

    +83

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    void somefunc(bool val)
    {
        assert(0 == val || 1 == val);
    ...
    }

    Многоуровневый говнокод. Во первых, индусское сравнение задом наперед. Во вторых, выражение в ассерте всегда истенно. Когда GCC возбухнул по этому поводу, то код был за-#ifdef-ен, но оставлен для других менее умных компиляторов.

    Запостил: alexzak, 11 Августа 2012

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

    • >индусское сравнение задом наперед
      Недавно на си-подобных языках начал писать, да?
      Ответить
      • Какой там недавно. Уже очень и очень давно!
        Ответить
    • >истенно
      сильно..
      Ответить
    • Классический бульшит.

      Возможно данный код был портирован с Си, где вместо bool использовали int, и проверяли этот самый инт на допустимые значения. При портировании int превратился в bool, а assert убрать забыли.

      0 == val не говно, а способ избежать глупой ошибки на старых компиляторах, которые не умели выдавать предупреждение о попутанных = и ==.

      P.S. Кстати в assert это предупреждение и сейчас не выдается ;) Только в if/while и им подобных.
      Ответить
      • Этот код не был портирован с С. Это новый код. На С++. Свеженкий, тепленький еще.

        И все-таки 0 == val - это говно!
        Ответить
    • Yoda condition во всей красе.
      Ответить
      • Ну откуда вы лезете? Так хуже всего, что Борманд комментом выше разжевал.
        Ответить
        • Я не говорил что это плохо.
          Ответить
          • Но сказано было так будто что-то плохое yoda-style из себя представляет.
            Ответить
    • Не понятно только одно - зачем на C++ для bool делать эту проверку?

      Если C и bool - тупо typedef unsigned char bool, то да - может и есть смысл.
      А то был у нас проект для embedded железяки - там кто что хотел, то и дефайнил как TRUE, но FALSE всегда был 0. И это порождало столько проблем, что в конечном итоге это привело к добавлению в стиль кодирования условия, говорившего что с TRUE в логических выражения сравнивать ни в каком случае нельзя - надо выражения выстраивать так чтоб сравнивалось с FALSE.

      Ну пусть даже у ОПа такая запущенная ситуация, но почему было не сделать макрос IS_BOOL(var) ?
      Ответить
      • > надо выражения выстраивать так чтоб сравнивалось с FALSE
        Вот за сравнение чего-либо с TRUE и FALSE (да и true и false) нужно убивать. Это же типичный бульшит...
        if (foo) { // true; }
        if (!foo) { //false; }
        Ответить
        • А если кто-то TRUE и FALSE передефайнит?!
          Ответить
          • > А если кто TRUE и FALSE передефайнит???

            > там кто что хотел, то и дефайнил как TRUE
            > но FALSE всегда был 0

            При таких условиях работать будет без проблем.
            Ответить
            • Сорри, я оставил без внимания коммент гостя. tl;dr.
              Ответить
              • Вот и @Abbath коммент @bormand'a счёл как tl;dr, а вы его ругаете...
                http://govnokod.ru/11573#comment150572
                И что ты смотришь на сучок в глазе брата твоего, а бревна в твоем глазе не чувствуешь
                Ответить
    • - А ещё... ещё он спросил, хочу ли я, чтобы он стал моим парнем!
      Ответить

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