You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@stdcxx.apache.org by Martin Sebor <se...@roguewave.com> on 2008/02/01 20:17:53 UTC
Re: [PATCH] STDCXX-705
Scott Zhong wrote:
> Actually ( 0x0 - 1 ) is going to give a misalign address, so we would
> want 0x0 - sizeof(size_t) instead
Okay, I've committed a modified version of your patch:
http://svn.apache.org/viewvc?view=rev&revision=616976
Thanks
Martin
>
> Index: 0.printf.cpp
> ===================================================================
> --- 0.printf.cpp (revision 616446)
> +++ 0.printf.cpp (working copy)
> @@ -165,15 +165,7 @@
> ++addr;
> }
> else {
> -
> -#ifndef _RWSTD_OS_HP_UX
> - // the first page is usually unmapped
> - addr = (char*)32;
> -#else
> - // the first page on HP-UX is readable, this might work
> - addr = (char*)(void*)bad_address + 1024 * 1024 * 16;
> -#endif // _RWSTD_OS_HP_UX
> -
> + addr = (char*)(void*)(0x0 - sizeof(size_t));
> }
>
> return addr;
>
> -----Original Message-----
> From: Scott Zhong [mailto:Scott.Zhong@roguewave.com]
> Sent: Tuesday, January 29, 2008 2:49 PM
> To: dev@stdcxx.apache.org
> Subject: RE: [PATCH] STDCXX-705
>
> I tried to access the red zone and a seg fault didn't occur but when
> trying to access the kernel address space it does cause a seg fault. I
> propose to change 0.printf.cpp to the following:
>
> Index: 0.printf.cpp
> ===================================================================
> --- 0.printf.cpp (revision 616446)
> +++ 0.printf.cpp (working copy)
> @@ -165,15 +165,7 @@
> ++addr;
> }
> else {
> -
> -#ifndef _RWSTD_OS_HP_UX
> - // the first page is usually unmapped
> - addr = (char*)32;
> -#else
> - // the first page on HP-UX is readable, this might work
> - addr = (char*)(void*)bad_address + 1024 * 1024 * 16;
> -#endif // _RWSTD_OS_HP_UX
> -
> + addr = (char*)(void*)(0x0 - 1);
> }
>
> return addr;
>
> -----Original Message-----
> From: Martin Sebor [mailto:sebor@roguewave.com]
> Sent: Tuesday, January 29, 2008 2:14 PM
> To: dev@stdcxx.apache.org
> Subject: Re: [PATCH] STDCXX-705
>
> Scott Zhong wrote:
>> Could
>>
>> addr = (char*)(void*)size_t(-1);
>>
>> Be a better choice for a bad address?
>
> I'm not sure.
>
> The weird looking expression in the function tries to compute
> an address that's beyond the last text segment page, or 16MB
> past the address of the bad_address function. It was just
> a wild guess that this address wouldn't be mapped. To get a
> more reliable value we'll need to take a loot at the address
> space layout of an HP-UX process. On IPF, it looks like there
> are (at least) four possible layouts:
> http://h21007.www2.hp.com/portal/download/files/unprot/Itanium/aas_white
> _paper.pdf
>
> From the white paper it looks like (void*)-1 might be a valid
> address in the 32-bit SHARE-MAGIC address space where the top
> of the address space is used for shared data. I suspect it
> would be an invalid (inaccessible) address in the 64-bit MGAS
> and MPAS models where the top is reserved for the kernel. In
> the 32-bit MPAS model the address is part of the stack so it
> would be valid if the stack grows down from it.
>
> But I think the safest bet on 64-bit HP-UX/IPF is to use the
> beginning of one of the two Red Zones for a bad address, or
> 0xa000 0000 0000 0000.
>
> On 32-bit HP-UX where the Red Zone isn't at any fixed location
> we might need to compute a bad address, e.g., as the next page
> after the top of the heap. Calling sbrk(0) should return the
> top of the process heap, so assuming the process doesn't
> allocate any private maps (0.printf shouldn't) any address
> pointing into the next page should be invalid.
>
> Do you want to verify that? :)
>
> Martin
>
>> -----Original Message-----
>> From: Scott Zhong [mailto:Scott.Zhong@roguewave.com]
>> Sent: Tuesday, January 29, 2008 1:22 PM
>> To: stdcxx-dev@incubator.apache.org
>> Subject: [PATCH] STDCXX-705
>>
>> the default page size can vary depending on the OS and can be changed
>> with chatr. Currently the test assumes the page size is 16kb which is
>> not the case on this platform thus causes the assertions to occur.
> For
>> the short term, we can adjust the multiplier to 64 instead of 16. For
>> the long term, we need a better method to create a bad address.
>>
>>
>> Index: 0.printf.cpp
>> ===================================================================
>> --- 0.printf.cpp (revision 616446)
>> +++ 0.printf.cpp (working copy)
>> @@ -171,7 +171,7 @@
>> addr = (char*)32;
>> #else
>> // the first page on HP-UX is readable, this might work
>> - addr = (char*)(void*)bad_address + 1024 * 1024 * 16;
>> + addr = (char*)(void*)bad_address + 1024 * 1024 * 64;
>> #endif // _RWSTD_OS_HP_UX
>>
>> }
>