On Sun, Oct 08, 2017 at 02:29:37PM -0400, Derrick Stolee wrote:
> A common mistake when writing binary search is to allow possible
> integer overflow by using the simple average:
>
> mid = (min + max) / 2;
>
> Instead, use the overflow-safe version:
>
> mid = min + (max - min) / 2;
>
> This translation is safe since the operation occurs inside a loop
> conditioned on "min < max". The included changes were found using
> the following git grep:
>
> git grep '/ *2;' '*.c'
>
> Making this cleanup will prevent future review friction when a new
> binary search is contructed based on existing code.
Thanks, this version looks good to me.
> diff --git a/compat/regex/regex_internal.c b/compat/regex/regex_internal.c
> index d4121f2f4..98342b831 100644
> --- a/compat/regex/regex_internal.c
> +++ b/compat/regex/regex_internal.c
> @@ -613,7 +613,7 @@ re_string_reconstruct (re_string_t *pstr, int idx, int
> eflags)
> int low = 0, high = pstr->valid_len, mid;
> do
> {
> - mid = (high + low) / 2;
> + mid = low + (high - low) / 2;
> if (pstr->offsets[mid] > offset)
> high = mid;
> else if (pstr->offsets[mid] < offset)
This one is a do-while, so it's less obvious that "high" is always more
than "low" when entering the loop. But one assumes it is so, since the
binary search wouldn't work otherwise.
-Peff