bug in optimised strstr
Jeff Johnston
jjohnstn@redhat.com
Thu Oct 2 20:09:00 GMT 2008
Jeff Johnston wrote:
> 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.
>
>
Patch works for x86-linux and is checked in. I don't have an arm system
to play around with. Sam, are you running arm-linux (which isn't in
newlib)? That would use the code in question. Otherwise, can you
provide more details (e.g. run under gdb and print out the various
information above)?
-- Jeff J.
More information about the Newlib
mailing list