This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: bug in optimised strstr


Jeff Johnston <jjohnstn <at> redhat.com> writes:

>   max_suffix = SIZE_MAX;
>   j = 0;
>   k = p = 1;
>   while (j + k < needle_len)
>     {
>       a = CANON_ELEMENT (needle[j + k]);
>       b = CANON_ELEMENT (needle[max_suffix + k]);
> 
> it is the line b=....
> 
> It cannot be correct as you are trying to reference SIZE_MAX + 1 the 
> first time through the loop.

But the comments state:

  /* Invariants:
     0 <= j < NEEDLE_LEN - 1
     -1 <= max_suffix{,_rev} < j (treating SIZE_MAX as if it were signed)
...

On cygwin, this works (in other words, I'm not reproducing the crash).  The 
intent is that this line is referencing needle[0].  What type is size_t on your 
platform, and the value of SIZE_MAX?  Could it be that there is some type 
promotion going on, where the result of SIZE_MAX+1 results in a 64-bit type 
containing 2**32 instead of 0, as is required by modulo math since size_t is 
unsigned?

-- 
Eric Blake




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]