- 1
assert(this!=NULL);
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+72.3
assert(this!=NULL);
Что-то мне подсказывает, что в правильно организованных проектах такого нет. Найдено во всех методах некоторых "избранных" объектах и частенько срабатывают. :)
guest 05.01.2010 17:40 # 0
Я не говорю, что это круто и правильно, скорее всего что-то в этом проекте ужасно нетак, но это по крайней мере объясняет срабатывание ассерта...
guest 05.01.2010 17:50 # 0
shapigor 06.01.2010 11:26 # +2
http://en.wikipedia.org/wiki/This_(computer_science)#C.2B.2B
Это особенно актуально, когда ты вызываешь метод класса через указатель на него. Есть методы, которые допускают такую семантику. Пример см. в ссылке.
Altravert 06.01.2010 11:37 # 0
guest 06.01.2010 11:55 # 0
guest 06.01.2010 11:56 # 0
guest 06.01.2010 11:57 # 0
guest 06.01.2010 11:58 # 0
guest 06.01.2010 14:21 # −1
Говногость 12.01.2010 14:07 # +1
Altravert 12.01.2010 17:39 # 0
Altravert 06.01.2010 11:38 # 0
guest 06.01.2010 12:38 # 0
shapigor 06.01.2010 14:22 # 0
С другой стороны, с помощью нехитрых манипуляций, можно вызвать _не_статический метод (в котором this определен) в "статическом контексте" - т.е. без передачи методу валидного указателя на объект.
Вообще говоря, это не приветствуется, и не факт что это поддерживается большинством компиляторов, но факт в том, что в некоторых фреймворках эту фичу используют - метод может быть вызван в статическом контексте и как метод экземпляра класса.
Что касается, данного поста, то код по-видимому знает, что его будут вызывать через указатель и поэтому проверяет, что вызов корректен - и ему передан валидный объект (адрес).
Altravert 12.01.2010 17:42 # 0
static stat_f(Class * cl)
{
cl->stat()
}
?
Или я опять ниче не понял. Можно примерчег?
guest 12.01.2010 18:06 # 0
public:
int metod(int arg)
{
return arg*2;
}
};
...
cout << ((Class*)0)->metod(2); //будет работать, пока metod не перепишут.
Altravert 12.01.2010 18:13 # 0
guest 05.01.2010 23:02 # 0
guest 06.01.2010 00:14 # 0
guest 06.01.2010 00:15 # 0
guest 06.01.2010 00:21 # 0
guest 06.01.2010 08:13 # 0
guest 06.01.2010 13:59 # 0
guest 06.01.2010 14:00 # 0
guest 06.01.2010 14:10 # 0
guest 12.01.2010 14:43 # +1.2
Altravert 12.01.2010 17:43 # 0
guest 12.01.2010 17:51 # 0
*((void*)1)=(*((void*)0));
Altravert 12.01.2010 17:55 # 0
Altravert 12.01.2010 17:58 # 0
guest 13.01.2010 11:10 # 0
Altravert 13.01.2010 13:06 # 0
guest 13.01.2010 18:07 # 0
Altravert 14.01.2010 06:14 # 0
guest 14.01.2010 11:28 # 0
Altravert 14.01.2010 11:31 # 0
guest 14.01.2010 11:30 # 0
Altravert 14.01.2010 11:31 # 0
Altravert 12.01.2010 18:19 # 0
guest 12.01.2010 20:35 # 0
guest 12.01.2010 20:36 # 0
Altravert 12.01.2010 21:42 # 0
guest 13.01.2010 11:11 # 0
Altravert 13.01.2010 13:06 # 0
guest 13.01.2010 12:43 # 0
Altravert 13.01.2010 13:06 # 0
guest 12.01.2010 18:09 # 0
asm ("int 3;");
Altravert 12.01.2010 18:14 # 0
Altravert 12.01.2010 18:17 # 0
guest 13.01.2010 12:42 # 0
guest 13.01.2010 12:43 # 0
guest 14.01.2010 11:31 # −1
guest 15.01.2010 06:15 # +1
guest 10.01.2010 04:31 # 0
А говнокод там, где создаётся объект по адресу 0.
Altravert 10.01.2010 06:53 # −3
if (!<указатель>) return.
guest 10.01.2010 23:04 # 0
Altravert 11.01.2010 06:31 # −1
guest 11.01.2010 16:27 # 0
guest 12.01.2010 02:09 # 0
Altravert 12.01.2010 08:24 # 0
guest 12.01.2010 11:51 # +1
Во-вторых, даже если ситуация this==NULL предусмотрена архитектурой, то это х#ёвая архитектура, провоцирующая ошибки.
Altravert 12.01.2010 17:46 # 0
Во-вторых, ошибками могут быть другие циферки, ага?
guest 12.01.2010 19:16 # 0
Какие двугие циферки? this==1? Мусор в указателях - это вообще звиздец, ни разу такого не случалось.
Altravert 12.01.2010 19:50 # 0
guest 12.01.2010 21:57 # 0
А вот это
>это стандартная ситуация. Например, конец связного массива
ты про что писал?
Altravert 13.01.2010 04:45 # 0
guest 13.01.2010 15:37 # 0
Altravert 13.01.2010 16:51 # 0
if (!<указатель>) return.
guest 13.01.2010 18:08 # 0
guest 13.01.2010 19:46 # 0
Altravert 14.01.2010 06:16 # 0
guest 14.01.2010 09:02 # 0
guest 14.01.2010 09:04 # 0
fixed. Долбаный xneur...
Altravert 14.01.2010 11:32 # 0
guest 14.01.2010 22:29 # 0
Пользуюсь отладчиком раз на 4к строк.
Altravert 15.01.2010 08:37 # 0
guest 15.01.2010 10:31 # 0
Altravert 15.01.2010 14:04 # 0
nil 15.01.2010 14:17 # 0
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.
guest 10.01.2010 11:44 # +1
Altravert 10.01.2010 12:01 # 0
guest 10.01.2010 13:48 # 0
assert(this!=NULL);
Где С++?
Altravert 10.01.2010 15:41 # +2
guest 10.01.2010 18:58 # 0
Altravert 10.01.2010 19:59 # 0
guest 12.01.2010 10:59 # 0
Я у себя так ошибку искал. Указатель на объект умирал (из-за ошибки в логике, код многопоточный, высокие требования к скорости, проблемы синхронизации, такой гемор), и проходил вызов метода уже убитого объекта. Что плохо: очень ИНОГДА (когда в момент вызова одного метода, одновременно вызывался другой, убивающий себя). Я ставил такие ассерты. Что делать...
guest 12.01.2010 11:53 # 0
guest 14.01.2010 01:36 # 0
Говногость 12.01.2010 14:14 # 0
guest 12.01.2010 14:37 # 0
Я у себя искал ошибку именно таким ассертом (и в нем он срабатывал). Вы можете утверждать что мой код плохой?
Altravert 12.01.2010 17:48 # 0
guest 12.01.2010 19:21 # 0
Внимательнее читай.
"ситуация this==NULL предусмотрена архитектурой" и assert(this) - это противоположные вещи. assert(this) - это параноидально, но правильно. А вот "if(!this)return;" - это всё, куку, досвидос.
Altravert 12.01.2010 19:52 # 0
guest 12.01.2010 21:47 # 0
Ну это-же говногод.ру, а не доброкот.ру :3
Говногость 12.01.2010 17:54 # 0
Сейчас пришлю весь проект. Ждите. ))))
guest 12.01.2010 23:23 # 0
guest 13.01.2010 12:44 # 0
guest 13.01.2010 15:48 # 0
Altravert 13.01.2010 16:54 # 0
guest 12.01.2010 18:12 # 0
Altravert 12.01.2010 17:48 # 0