On Mon, Oct 27, 2003 at 06:46:01AM -0800, James Berry wrote: > On Oct 27, 2003, at 6:00 AM, Ronald Landheer-Cieslak wrote: > > > Q: what's the alignment I should use? > > A: something smaller than the size of a pointer - like zero! > >Result: part of - or everything of - the pointer can (and will) be > >overwritten > >with user data. Thinking of it a bit more, I think a patch should be > >done to > >XMLPlatformUtils::alignPointerForNewBlockAllocation that checks whether > >XML_PLATFORM_NEW_BLOCK_ALIGNMENT < the pointer size, and if so makes > >it return > >zero. The caller should check whether 0 was returned and not assume > >anything > >about the pointer stored in the data area if it is. Like that, the > >semantics > >become well-defined and the question gets a correct answer. > You've misread the code. The alignment has no effect on how much space > is reserved for the block header. Space for the block header is > allocated anyway. The alignment simply dictates the alignment of the > data following the block header. > > An alignment of < pointer size is perfectly legal for some > architectures, which might allow alignment of 1, 2, etc. > > A bogus configuration that specifies alignment of zero will: > > (1) Not cause any overwriting of data. > (2) Will likely give an immediate divide by zero runtime error in > execution as the expression > size_t current = ptrSize % alignment; > is evaluated. > > (I've added a comment to the alignPointerForNewBlockAllocation code, > noting that a XML_PLATFORM_NEW_BLOCK_ALIGNMENT declaration of zero is > illegal). Severe cafeine deprivation strikes again :(
In deed I mis-read the XMLPlatformUtils::alignPointerForNewBlockAllocation function.. > I don't agree. alignPointerForNewBlockAllocation does not return false > information, nor should it return zero, ever, unless input of zero is > given to it. It works correctly. You're right - I've got my eyes open this time ;) > The problem that needs to be understood is what is causing spurious > crashes in your environment. You have guessed that an improper > alignment specification for your architecture may be at fault. If > that's proven to be the case then we can move forward to dealing with > it. Yes, well, that much seems to be proven, as going to a 16-byte alignment eliminated the problem for me. In any case, the only part that still bothers me (except for the fact that alignment is done at all, which I don't particularly like) is in lines 137 through 143 of this part of the code: 129 void XMemory::operator delete(void* p, MemoryManager* manager) 130 { 131 assert(manager != 0); 132 133 if (p != 0) 134 { 135 size_t headerSize = XMLPlatformUtils::alignPointerForNewBlockAllocation(sizeof(MemoryManager*)); 136 void* const block = (char*)p - headerSize; 137 assert(*(MemoryManager**)block == manager); 138 /*** 139 * NOTE: for compiler which can't properly trace the memory manager used in the 140 * placement new, we use the memory manager embedded in the memory rather 141 * than the one passed in 142 */ 143 MemoryManager* pM = *(MemoryManager**)block; 144 pM->deallocate(block); 145 } 146 } i.e. the code doesn't trust the parameters of the function. I think that is wrong because I might very well like to write a memory manager that can take over the management from another one - and there is no reason why I shouldn't. Personally, I think that if client code passes in a parameter it is up to that code to make sure it's OK - if not, there's no reason not to go KO. As for alignment being done at all: I'd also like it to be possible not to use the header and to always use the default managers, but that could be just me. If such a functionality seems interesting to anyone, I'm willing to provide a patch :) rlc --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]