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

0

  1. 1
assert(this!=NULL);

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

Запостил: Говногость Говногость, (Updated )

Комментарии (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.
    Ответить
        • Я другой гость, но согласен. Молчаливое игнорирование ошибок - это ламерство, за которое руки надо отрывать.
          Ответить
          • Ну руки, прямо скажем, отрывать не нужно, но лишить премии - как минимум.
            Ответить
          • Это не игнорирование ошибки, это стандартная ситуация. Например, конец связного массива. Это вообще-то можно СПЕЦИАЛЬНО использовать.
            Ответить
            • Во-первых, assert и return - не одно и то же, к твоему сведению.
              Во-вторых, даже если ситуация this==NULL предусмотрена архитектурой, то это х#ёвая архитектура, провоцирующая ошибки.
              Ответить
              • Во-первых, я в курсе, не одно. Я про данную ситуацию.
                Во-вторых, ошибками могут быть другие циферки, ага?
                Ответить
                • Какую данную ситуацию? Которая сабжевый говнокод или с которой ты ветку начал?
                  Какие двугие циферки? this==1? Мусор в указателях - это вообще звиздец, ни разу такого не случалось.
                  Ответить
                    • Ну к сабжевому у меня лично претензий нет (конкретно к опубликованной строчке нет, ко всему, что за кадром - ещё как есть).

                      А вот это

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

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

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

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

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

Из-за тебя ушел bormand, guest!

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


    8