bug in optimised strstr

Jeff Johnston jjohnstn@redhat.com
Thu Oct 2 20:03:00 GMT 2008


Eric Blake wrote:
> 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?
>
>   
Ok, I got mixed up on what SIZE_MAX was supposed to be.  For x86, 
stdint.h is being overridden with one in libc/sys/linux/include that has 
a wrong value for SIZE_MAX (LONG_MAX).  I am rebuilding now.  I can't 
say what is happening for arm since it should be using the same stdint.h 
from libc/include.

-- Jeff J.





More information about the Newlib mailing list