On Tuesday 05 November 2013 12:24:32 Marc Mutz wrote: > On Tuesday, November 05, 2013 01:07:32 Thiago Macieira wrote: > > - return (void *)qptrdiff(data); > > + char *null = 0; > > + return null + qptrdiff(data); > > Since this is equivalent to > > return 0[qptrdiff(data)]; > > isn't that dereferencing the nullptr and therefore undefined behaviour?
That's indeed an undefined behaviour. The compiler is allowed to optimize this function by removing it. > What's wrong with > > reinterpret_cast<void*>(qptrdiff(data)); Yes, that's how it should be. > Or simply > > return ptr; > > which forms a union with `data`? No, that does not work. ptr is never actually used, and can never be used. That's because storing the pointer is not done using ptr, but it is done with data = qptrdiff(somePointer); (indirectly via QAbstractXmlNodeModel::createIndex) As a result, if one store for example the pointer 0xabcdef00 on a 32bit big endian machine, it would result in memory: 0x00000000abcdef00 with data = 0x00000000abcdef00 as expected, but ptr = 0 -- Olivier Woboq - Qt services and support - http://woboq.com - http://code.woboq.org _______________________________________________ Development mailing list [email protected] http://lists.qt-project.org/mailman/listinfo/development
