------- Comment #21 from david dot kirkby at onetel dot net  2009-07-18 01:18 
-------
(In reply to comment #20)
> (In reply to comment #19)
> > (In reply to comment #18)
> > > I've compiled and linked that code. It does not abort.
> > 
> > Bad point for this theory :-(
> > The result could still depend on the alignment of the pointer, so you could 
> > try
> > replacing buf[0] by buf[4] and calling memset(buf+4,...) (try several small
> > values instead of 4).
> > 
> 
> I tried this in a loop. It still works, with no abort. 
> 
> 
> typedef __SIZE_TYPE__ size_t;
> extern void *memset (void *, const void *, size_t);
> extern void abort (void);
> volatile size_t i = 0x80000000U, j = 0x80000000U;
> char buf[16];
> 
> int main (void)
> {
>   int n;
> 
>   for (n=0 ; n <=64;++n) {
>     if (sizeof (size_t) != 4)
>       return 0;
>     buf[n] = 6;
>     memset (buf+n, 0, i + j);
>     if (buf[0] != 6)
>       abort ();
>   }
>   return 0;
> }
> 
> I extended 'n' to larger values and find it does abort when it is 5592, but 
> not
> exactly the 'small' value you were looking for. 
> 

Looking closely, you only declared allocated 16 bytes for the buffer, so it was
hardly surprising it aborted at large n. When I increased the buffer size, so
it worked as expected, even for n as large as 10000

dave


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40757

Reply via email to