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

    +72.3

    1. 1
    assert(this!=NULL);

    Что-то мне подсказывает, что в правильно организованных проектах такого нет. Найдено во всех методах некоторых "избранных" объектах и частенько срабатывают. :)

    Запостил: Говногость, 05 Января 2010

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

    • Вариант: функции статические, но выполняют немного разные действия в зависимости от того, вызываются они статически или от объекта.

      Я не говорю, что это круто и правильно, скорее всего что-то в этом проекте ужасно нетак, но это по крайней мере объясняет срабатывание ассерта...
      Ответить
      • Ну ты дебил, какой зыз в статических функциях и какие статические функции от объекта?
        Ответить
        • Ты бы подумал/почитал что ли перед тем как оскорблять других...

          http://en.wikipedia.org/wiki/This_(computer_science)#C.2B.2B

          Это особенно актуально, когда ты вызываешь метод класса через указатель на него. Есть методы, которые допускают такую семантику. Пример см. в ссылке.
          Ответить
          • Согласен, похоже это обработка вызова метода через нулевой указатель. Лишь непонятно зачем ассерт. Имхо большой плюс указателя в том, что он может быть 0. НА это много чего повесить можно. Не говнокод, имхо.
            Ответить
            • Видимо кто-то не мог отловить почему у него некоторые указатели на объекты равны NULL, поэтому пытаеться что-то придумать с ассертами. Видимо у него банально раньше времени удаляеться объект или вообще память не выделяеться. А может просто порча памяти и указатель затерся. Тоесть вероятнее всего у него вообще весь код - говнокод.
              Ответить
              • Да. Теперь весь проект рефакторить, что-бы исправить. Наверное порча памяти. Код ужасен весь, потому и ошибок моря.
                Ответить
          • Кстати, дебаггер всё равно на таких местах останавливается красиво.
            Ответить
          • Этож говнокод! Мне всегда нравилось, что можно обосрать кого-нить, особенно не по теме =) Ну и че там написано? Я ж грю не про то что код говно, а про то что зыза в статических функйиях нет..
            Ответить
            • В статических функциях - this не существует.
              С другой стороны, с помощью нехитрых манипуляций, можно вызвать _не_статический метод (в котором this определен) в "статическом контексте" - т.е. без передачи методу валидного указателя на объект.

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

              Что касается, данного поста, то код по-видимому знает, что его будут вызывать через указатель и поэтому проверяет, что вызов корректен - и ему передан валидный объект (адрес).
              Ответить
              • Это типа
                static stat_f(Class * cl)
                {
                cl->stat()
                }
                ?
                Или я опять ниче не понял. Можно примерчег?
                Ответить
                • class Class {
                  public:
                  int metod(int arg)
                  {
                  return arg*2;
                  }
                  };
                  ...
                  cout << ((Class*)0)->metod(2); //будет работать, пока metod не перепишут.
                  Ответить
    • Разгребать это будет тяжело...
      Ответить
    • Интересно, а как это возможно, что-бы this, да был равен NULL?
      Ответить
      • Я такое даже в страшном сне представить себе не могу. Странно, что срабатывает ассерт... Может компилятор тово?
        Ответить
    • Помоему это конец проекта. ;)
      Ответить
    • Просто поменяй компилятор. Делов то...
      Ответить
      • Это не поможет. Не в компиляторе дело. Дело в коде. Он говно. Нужно правильно было работать с указателем.
        Ответить
    • Смещъно сцъуко. Они срабатывают... Ой не могу... Хахахъа... Ну и код наверно у тебя в проектъе... Я даже не знаю как это нужно было наговнокодитъ...
      Ответить
      • Вот что интересно: кто больше всех стебется над кодом, тот НЕ пишет такой код. А зря. Ассерты специально были сделаны для быстрого поиска ошибок. И если ассерт сработал, то это повод найти ошибку и исправить. У меня весь код в ассертах. и они срабатывают (не ошибается только тот, кто ничего не делает). Но я нахожу и исправляю ошибки. А вы, пишите бажные (а значит говно-) проги. И стебетесь на другими, кто пишет хорошие. Из зависти?...
        Ответить
    • Ассерты - не говнокод по определению. В чьём-то блоге проскальзывала мысль, что в большом и сложном проекте даже assert(M_PI<4) может однажды сработать и сэкономить время на отладке.
      А говнокод там, где создаётся объект по адресу 0.
      Ответить
    • Для этого достаточно
      if (!<указатель>) return.
      Ответить
      • -1
        Ответить
        • Обоснуй, а?
          Ответить
          • Я другой гость, но согласен. Молчаливое игнорирование ошибок - это ламерство, за которое руки надо отрывать.
            Ответить
            • Ну руки, прямо скажем, отрывать не нужно, но лишить премии - как минимум.
              Ответить
            • Это не игнорирование ошибки, это стандартная ситуация. Например, конец связного массива. Это вообще-то можно СПЕЦИАЛЬНО использовать.
              Ответить
              • Во-первых, assert и return - не одно и то же, к твоему сведению.
                Во-вторых, даже если ситуация this==NULL предусмотрена архитектурой, то это х#ёвая архитектура, провоцирующая ошибки.
                Ответить
                • Во-первых, я в курсе, не одно. Я про данную ситуацию.
                  Во-вторых, ошибками могут быть другие циферки, ага?
                  Ответить
                  • Какую данную ситуацию? Которая сабжевый говнокод или с которой ты ветку начал?
                    Какие двугие циферки? this==1? Мусор в указателях - это вообще звиздец, ни разу такого не случалось.
                    Ответить
                    • Сабжевый. Хз, имхо удобно.
                      Ответить
                      • Ну к сабжевому у меня лично претензий нет (конкретно к опубликованной строчке нет, ко всему, что за кадром - ещё как есть).

                        А вот это

                        >это стандартная ситуация. Например, конец связного массива

                        ты про что писал?
                        Ответить
                        • Массив, содержащий итераторы (элемент + указатель на следующий + на предыдущий). Тогда у первого prev = 0 и у последнего next = 0. Простой вариант вектора.
                          Ответить
                          • и зачем здесь "if(!this) return;"? Или ты имел ввиду "if(!next) return;"? Так это совсем другое дело, это, разумеется, нормально.
                            Ответить
                            • А ты посмотри повыше: я ни слова про this не сказал. Я сказал
                              if (!<указатель>) return.
                              Ответить
                              • Хватит выкручиваться, как уж на сковородке.
                                Ответить
                              • Ты сказал "для этого достаточно". Херню сказал, так и признай.
                                Ответить
                                • Я имел ввиду, что достаточно вместо этого ассерта перед вызовом содержащей его функции поставить данную строчку. Неправильно выразился -- да, херню сказал. Выкручиваюсь... Да мне в принципе по хую, считай как хочешь, гостила.
                                  Ответить
                                  • Ассерт всё равно полезен. Функций "перед" может быть много, в одной нет-нет, да и забудешь этот твой if(!p)returВВеещищ параллельные.
                                    Ответить
                                    • нет-нет, да и забудешь этот твой if(!p)return; Вещи параллельные.

                                      fixed. Долбаный xneur...
                                      Ответить
                                      • Отладчик напоминает.
                                        Ответить
                                        • Отладчик не нужен.
                                          Пользуюсь отладчиком раз на 4к строк.
                                          Ответить
                                          • Мне нужен, и че?
                                            Ответить
                                          • 4. Debuggers. We've got debuggers, one we support and one we use.
                                            You shouldn't make mistakes anyway, it is a waste of time. We
                                            don't want to hear anything about debuggers, we're not interested.
                                            See figure 1.
                                            Ответить
    • Где сдесь С++?
      Ответить
      • Погугли.
        Ответить
      • void* this;
        assert(this!=NULL);
        Где С++?
        Ответить
      • Не ищите больше С++. С++ сдесь нет и не будет. Он ушёл в guest.
        Ответить
        • Я понял. Это Бьерн пишет. Он живет на энергетиках в поисках неверных, не различающих си и плюсы... А дальше он начнет мстить огнем тысячи солнц!
          Ответить
    • Я не понял, почему это ГК?
      Я у себя так ошибку искал. Указатель на объект умирал (из-за ошибки в логике, код многопоточный, высокие требования к скорости, проблемы синхронизации, такой гемор), и проходил вызов метода уже убитого объекта. Что плохо: очень ИНОГДА (когда в момент вызова одного метода, одновременно вызывался другой, убивающий себя). Я ставил такие ассерты. Что делать...
      Ответить
      • Это не говнокод. Просто тут много нихрена не понимающих в разработке ламеров, вот они постят и обсерают нормальный (но не хороший) код.
        Ответить
      • Как-бы тут "обсераеться" не конкретно эта строка, а тот код, в котором этот ассерт срабатывает. Самого кода здесь естественно нет, но можете мне поверить, что там просто настоящий говнокод. Вперемежку Си и С++ методы разработки, препроцессор, притом все перемешано просто дико.
        Ответить
        • Если не видишь кода, то как его можно обсуждать и критиковать?
          Я у себя искал ошибку именно таким ассертом (и в нем он срабатывал). Вы можете утверждать что мой код плохой?
          Ответить
          • +1, мне выше уже втерли, что у меня архитектура "х#евая" из-за таких ассертов.
            Ответить
            • >архитектура "х#евая" из-за таких ассертов.

              Внимательнее читай.
              "ситуация this==NULL предусмотрена архитектурой" и assert(this) - это противоположные вещи. assert(this) - это параноидально, но правильно. А вот "if(!this)return;" - это всё, куку, досвидос.
              Ответить
              • Ну вот, все обосрали. Не знаю короче, у меня все работает как надо.
                Ответить
                • >Ну вот, все обосрали

                  Ну это-же говногод.ру, а не доброкот.ру :3
                  Ответить
          • >Если не видишь кода, то как его можно обсуждать?
            Сейчас пришлю весь проект. Ждите. ))))
            Ответить
            • Ну чё? Слабо показать? Ты только на слова горазд? Слобак...
              Ответить
            • Ждёмс. :D
              Ответить
            • Выкладывай абсалютно весь код, а мы посмотрим. Может что-нибудь продадим.))))))
              Ответить
          • А покажи в чём была ошибка. Прямо тут, в каментах. Интересно же.
            Ответить
        • Покажи тогда может пример использования этой строчки из кода? Чтоб все успокоились)
          Ответить

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