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

    +6

    1. 1
    2. 2
    3. 3
    4. 4
    list* down_if_valid_me(void)
    {
    	return this ? this->down() : NULL;
    }

    Запостил: LispGovno, 12 Июля 2013

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

    • Я вот размышляю, подсунули ли мне код с UB? Нужно ли пожурить? На данный момент все эти методы не виртуальны, пока.
      Ответить
    • Он даун, если я нормальный
      Ответить
      • АХАХХА ПРИКОЛ ПРИКОЛ АНЕКДОТ СМЕШНОЙ



        РУСКИЙ И АМЕРИКАНЕЦ ЗАХОДЯТ В ЛИФТ АМЕРИКАНЕЦ ГОВОРИТ ДАУН А РУСКИЙ ТАКОЙ САМ ТЫ ДАУН

        А ДАУН ПО АМЕРИКАНСКИ ВНИЗ А РУСКИЙ ДУМАЛ ЕГО ОБОЗВАЛИ АХАХА ДОШЛО ДОШЛО ДА ВОТ ПРИКОДЛ
        Ответить
    • Это UB. this не может быть равен NULL
      Ответить
      • > this не может быть равен NULL
        Может. Но это UB :)
        SomeClass *p = NULL;
        p->down_if_valid_me();
        Ответить
      • this - по существу, дополнительный параметр-указатель, передающийся при вызове метода.
        Если к параметру this не происходит явных или неявных обращений (e.g. не производится доступа к полям), то код выполняется, как и должен.
        Ответить
        • http://ideone.com/m97C8j
          Ответить
          • Т.е.
            Pituh *p = NULL;
            p->Golos();

            в данном случае всего лишь
            Pituh_Golos(NULL);
            Ответить
            • Верно, но требуется уточнение: если используются только статические методы, т. к. для доступа к виртуальным потребуется инициализировать ТВМ.

              http://ideone.com/nbBOPs — к виртуальным без this не достучаться.
              Ответить
              • http://ideone.com/TnQJll
                Ответить
                • А так падает: http://ideone.com/vzpqvI
                  Ответить
                  • А вот тут уже ниче не сделать. Вызов Golos из Golosok с кривым this не пролезет...
                    Ответить
                    • А откастить?
                      Ответить
                      • Ну так трабла в чем - Pituh::Golosok то вызывается нормально, но внутри него скрыт вызов виртуального метода, который на нулле сфейлится. Само собой можно написать return (*((Kokoko**)&tmp))[1], чтобы дернуть Golos, вместо него, но это уже не то ;)
                        Ответить
      • Кстати, в MFC везде стоят проверки на нулёвость this.

        Ну на то он и MFC. Это пособие по тому, как не нужно проектировать объектную библиотеку.
        Ответить
    • Я понял зачем это! Автор хочет, чтобы работало как в Objective C:
      some *p = a->b->c->d;
      if (p) { .. }
      И никаких лишних проверок на null'ы :)
      Ответить
    • показать все, что скрытососу хуи даю в жопу
      Делаю минеты
      Ответить
    • this может быть null и не упасть?
      Ответить
      • Может. Не падает, если не дергать виртуальные методы и не лезть в поля. Но делать так - ССЗБ.
        Ответить
        • ого. в той же джаве не может. ну там все методы виртуальные
          Ответить
          • Да просто невиртуальный метод - это обычная функция, первым параметром которой идет this. А проверки на NULL кресты автоматом не вставляют. Поэтому ничего и не падает.

            А в джаве, кстати не все виртуальные - есть же статики, и final'ы вроде как оптимизируются в невиртуальный вызов.
            Ответить
            • у статиков this нет по определению, даже код с указанием this в статиках не скомпилится
              а final только запрещает переопределение, но всегда упает с NPE на nullевом объекте (может инлайнить по своему усмотрению)
              Ответить
              • В Java есть invokevirtual, invokeinterface, invokestatic и invokespecial.

                Вот последний используется для вызова private-методов, ибо там класс известен и полиморфное поведение не нужно.

                Но он всё равно валится по NPE, даже если в private-методе this никак не используется.
                Ответить
          • показать все, что скрытоVanished
            Ответить
      • bormand даже виртуальные методы вызывает с нулевым this. См. зелёную ссылку.
        Ответить
      • показать все, что скрытоVanished
        Ответить
    • показать все, что скрыто???????
      Ответить

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