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
>>  
>>      }
>