Please stop top-posting.

Kai Tietz writes:
 > 
 > Richard Henderson <[EMAIL PROTECTED]> 
 > 08.03.2007 19:08
 > 
 > > On Thu, Mar 08, 2007 at 06:06:57PM +0100, Kai Tietz wrote:
 > > > > In gcc the file emutls.c assumes that a long has sizeof void * in 
 > > function 
 > > > > emutls_destroy.
 > > 
 > > Not really.  It assumes you can store the size of the array
 > > in min(sizeof(long), sizeof(void*)) bytes.

 > Just really ! The array arr has the type void ***, the cast happens on the 
 > first derefencing of arr. So the result remains a void **, which is for 
 > sure a pointer. This leads to a pointer truncation, 

RTH is right.  It isn't a pointer, it's an integer that has been
stored in a pointer.  The pointer is not truncated, since it was never
a pointer in the first place.  There is certainly no assumption that
long has sizeof void*, just that void* is large enough to hold the
length.

 > therefore to a warning  and a build failure. It is clear, that the first 
 > element of the array arr is in fact the integer value of a type with 
 > sizeof(void *).
 > Wouldn't is better to have for this cast monster a structure. Something 
 > like 
 >         struct sFieldArray {
 >                 size_t count;
 >                 void *arr[1];
 >         }
 > ?

Andrew.

Reply via email to