- 1
- 2
const void* const relay(const TrigClass& Overloading=*((TrigClass*)(NULpoter))){
if(&Overloading==NULpoter){
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+169
const void* const relay(const TrigClass& Overloading=*((TrigClass*)(NULpoter))){
if(&Overloading==NULpoter){
guest 22.06.2011 17:47 # +10
rat4 22.06.2011 20:09 # +4
guest 22.06.2011 20:10 # 0
SIGSEGV 22.06.2011 21:59 # 0
guest 22.06.2011 22:03 # −1
Никаких грязных хаков. Просто инициализированный 0 указатель.
gegMOPO4 25.06.2011 16:03 # 0
guest 25.06.2011 16:06 # +1
SIGSEGV считает, что relay() - грязный хак
gegMOPO4 25.06.2011 17:51 # 0
NULpoter — не обязательно NULL, и даже наверняка не NULL.
guest 25.06.2011 18:04 # 0
Ага, например 0 или (void*)0.
bugmenot 25.06.2011 19:04 # 0
> 0 указатель
о укатель
Lure Of Chaos 26.06.2011 16:53 # 0
dosGovno 26.06.2011 17:37 # 0
macGovno 22.06.2011 22:42 # 0
По строчке
> if(&Overloading==NULpoter){
можно предположить что это просто
typedef 0 NULpoter;
Тогда дефолтный аргумент хорош : ))))
guest 22.06.2011 23:47 # 0
Чем же он так хорош?
macGovno 22.06.2011 23:49 # 0
приведёт к UB
guest 23.06.2011 00:16 # 0
Разыменование указателя с нулевым значением не приводит к access violation, тк нет обращения к памяти по 0му адресу. А вот если попытаться почитать или пописать по этому адресу, то да - UB.
Хотя, не смотря на то, что UB расшифровывается как undifined behaivor, большинство здесь присутствующих знают что при этом будет на большинстве платформ.
macGovno 23.06.2011 01:32 # +1
> Certain other operations are described in this International Standard as undefined (for example, the effect of dereferencing the null pointer).
или вот в 8.3.2.4
> ... in particular, a null reference cannot exist in a well-defined program, because the only way to create such a reference would be to ind it to the “object” obtained by dereferencing a null pointer, which causes undefined behavior....
Вообще это ещё дальше должно быть явно написано в разделе про унарные операторы, но не вижу чтото.
guest 23.06.2011 01:39 # −1
macGovno 23.06.2011 01:46 # +1
guest 23.06.2011 12:43 # 0
Очень зря. :) Вот первые версии GCC запускали игру Rogue при UB. :D
guest 23.06.2011 01:26 # +1
>typedef O NULpoter;
Эпичненько....
зы: О_о Взять 0 в ббтег b нельзя, он пропадает. ну и нравы здешнего говнокода сайта говнокод. о_О
macGovno 23.06.2011 01:43 # 0
#define NULpoter 0
имелось ввиду
gegMOPO4 25.06.2011 16:09 # 0
Ура!
guest 25.06.2011 18:05 # 0
gegMOPO4 25.06.2011 19:30 # 0
guest 25.06.2011 20:44 # 0
guest 25.06.2011 20:44 # 0
gegMOPO4 25.06.2011 16:08 # 0
guest 25.06.2011 18:06 # 0
gegMOPO4 25.06.2011 19:40 # 0
1. NULL физически представляется нулевыми битами, а нам нужно отличить неинициализированную по ошибке память от «нулевого» указателя.
2. Нужно добиться сегфолта при ошибочном разыменовании указателя, а NULL указывает на доступную память, хуже того — доступную для записи (а там вектора прерываний, ой).
3. Нужно различать NULL-ы разных типов.
4. Нужно иметь специальное значение для указателя, допускающее разыменование (например p->name() возвращает "Undefined"). Тогда заводят специальный объект, и указатель на него используют вместо NULL. Иногда нужно даже несколько специальных указателей ("Undefined" и "Unknown").
5. Специальный указатель имеет ограниченную видимость и применяется только в одной функции. В примере выше это может быть для того, чтобы отличить вызов без параметра от вызова с параметром (включая NULL). Это хак, можно сделать иначе, и вряд ли здесь так.
guest 25.06.2011 20:43 # 0
2 - во всех известных мне платформах, где можно добиться сегфаулта - вектора прерываний можно перемещать.
3, 4 - Когда такое бывает нужно? Можно привести примеры?
gegMOPO4 25.06.2011 21:34 # 0
3. Признаюсь, этот вариант я выдумал только-что сам. ;) Но пример может быть частным случаем 4.
4. Пример. Есть игровая карта, разделена на провинции. Каждая провинция либо принадлежит какому-то королю, либо ничья. Объект провинции содержит указатель на короля-владельца. Для клиента нужно различать провинции, которые никому не принадлежат, и о владельце которых ничего не известно. Вот два специальных варианта. Можем завести два флага (или один флаг и указатель NULL) и проверять их каждый раз, когда нужно вывести имя владельца или его цвет, а можем завести два специальных глобальных объекта со специальными свойствами и не парится проверками.
SmackMyBitchUp 25.06.2011 22:51 # +3
guest8 09.04.2019 11:02 # −999
guest8 09.04.2019 18:08 # −999
guest8 09.04.2019 18:27 # −999
guest8 09.04.2019 18:27 # −999
guest8 09.04.2019 18:28 # −999
guest8 09.04.2019 18:28 # −999
guest8 09.04.2019 18:28 # −999
guest8 09.04.2019 18:28 # −999
guest8 09.04.2019 18:29 # −999
guest8 09.04.2019 18:29 # −999
guest8 09.04.2019 18:29 # −999
guest8 09.04.2019 18:29 # −999
guest8 09.04.2019 18:29 # −999
guest8 09.04.2019 18:30 # −999
guest8 09.04.2019 18:30 # −999
guest8 09.04.2019 18:30 # −999
guest8 09.04.2019 18:31 # −999
guest8 09.04.2019 18:31 # −999
guest8 09.04.2019 18:31 # −999
guest8 09.04.2019 18:31 # −999
guest8 09.04.2019 18:31 # −999
guest8 09.04.2019 18:32 # −999
guest8 09.04.2019 18:32 # −999
guest8 09.04.2019 18:32 # −999
cmepmop 09.04.2019 18:36 # +1
guest8 12.04.2019 14:24 # −999