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

    +990.3

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    bool CUser::IsFavorite(const CGuid &guid)
    {
     ASSERT(this);
     if(!this )
      return false;
    ...
    }

    Запостил: guest, 12 Марта 2009

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

    • GetSafeHwnd-style hack
      Ответить
    • Проходим:
      Это на случай вызова как статического?
      Ответить
    • А где говнокод? Или никто из здешних ни разу не участвовал в разработке проекта на C++ больше 100000 строк?
      Ответить
    • И в чём говнокод? Ассерт не гарантирует отсутствие ошибки, так как в релизе не работает. Уж лучше детерминированное поведение (с выводом ошибки и корректным завершением), чем неопределённое, так как дальнейший код полагается на этот ассерт.
      Ответить
    • [quote=Говногость]А где говнокод? Или никто из здешних ни разу не участвовал в разработке проекта на C++ больше 100000 строк?[/quote]
      Участвую. Но там такого нет.

      if(!this ) return false; - Это говнокод, как бы намекающий что аффтар знает, что CUser::IsFavorite вызывается для нулевого указателя, но не в состоянии этот баг пофиксить.
      Ответить
    • Так как assert написан большими буковками, то это как бы намекает. По моему нет ничего общего с говнокодом, если assert - макрос или другая функция, не делающая то что делает assert() в <assert.h>. Насчет статической функции - компилятор не позволит использовать this в статических функциях. Далее в защиту данного кода: если конструктор данного класса вызывает исключение, то! о-ля-ля this == NULL в любом из его методов. Хотя мне искренне кажется маловероятным тот факт, что автор кода применял данный код для обработки такой ситуации.
      Ответить
    • ГовноКодер:
      this == NULL обычно, если вызвать функцию так:
      TClass* obj=NULL;
      obj->Function();
      Ну или что-то в таком духе.
      Вот в функции Function() как раз и будет this==NULL.
      Ответить
    • Ну это может и прокатило бы для методов типа Release(), где delete this, чтобы не проверять указатель на 0 перед вызовом. Но все равно нехорошо так делать.
      Ответить

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