Можно ли [s]делить на 0[/s] дереференсить NULL?

yolki

ну вот какого фига?
xerces-c-src_2_7_0\src\xercesc\dom\impl\DOMCasts.hpp:119

static inline DOMNode *castToNode(const DOMParentNode *p ) {
DOMElementImpl* dummy = 0;
size_t parentOffset = (char *)&(dummy->fParent) - (char *)dummy;
char *retPtr = (char *)p - parentOffset;
return (DOMNode *)retPtr;
}

я конечно понимаю, что имеется в виду, но блжад, они надеются на оптимизации? или это какое-то ожидаемое поведение, специфицированное в стандарте?

elenangel

&(dummy->fParent)
это же конст экспрешшн, который вычислится в компайл тайм.

katrin2201

Весело. Убивать, конечно, за такой код надо. Желательно через бабуку.
Вообще, покуда мы не попытаемся прочитать данные из этого дамми - сегфолта не будет. Представь себе, как "(char *)&(dummy->fParent) - (char *)dummy" будет в асме выглядеть. Особых вариантов нет - и никакой оптимизатор не нужен, чтобы оно не пыталось читать по нулевым адресам.

vall

а где-то тут увидел дереференс? нормальные люди называют это offsetof а всё вместе container_of
http://en.wikipedia.org/wiki/Offsetof

ava3443

нормальные люди называют это offsetof
Нормальные люди здесь - это белые люди, работающие на свежих версиях мейнстримовых компиляторов и платформ. Им не приходится сталкиваться с львиной долей платформ и компиляторов (в том числе реликтовых на которых успешно собирается и работает Xerces-C++.

agaaaa

А зачем тут вообще указатель? Почему то же самое с обычной переменной не сделать?

elenangel

под обычную переменную память на стеке выделится и потом освободится, а так все расчеты будут произведены во время компиляции без выделения памяти.
Оставить комментарий
Имя или ник:
Комментарий: