aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-04-09 14:58:07 -0400
committerGitHub <noreply@github.com>2020-04-09 14:58:07 -0400
commit543031db35ede984b60a00c8f8a7859c6acfebdd (patch)
tree9e11d46350f628786c3205ab2ad1d1642fd89e2e
parentf1360bee1ce6096f1c123347313a7d24a0d90650 (diff)
parentf5f77089b76be2832640884f14c552c49c9fda1f (diff)
downloadzig-543031db35ede984b60a00c8f8a7859c6acfebdd.tar.gz
zig-543031db35ede984b60a00c8f8a7859c6acfebdd.zip
Merge pull request #4982 from MageJohn/fix/binarySearch
sort.binarySearch: fix integer underflow (#4980)
-rw-r--r--lib/std/sort.zig13
1 files changed, 7 insertions, 6 deletions
diff --git a/lib/std/sort.zig b/lib/std/sort.zig
index 3447a05769..8ed8f2c1c0 100644
--- a/lib/std/sort.zig
+++ b/lib/std/sort.zig
@@ -6,20 +6,17 @@ const math = std.math;
const builtin = @import("builtin");
pub fn binarySearch(comptime T: type, key: T, items: []const T, comptime compareFn: fn (lhs: T, rhs: T) math.Order) ?usize {
- if (items.len < 1)
- return null;
-
var left: usize = 0;
- var right: usize = items.len - 1;
+ var right: usize = items.len;
- while (left <= right) {
+ while (left < right) {
// Avoid overflowing in the midpoint calculation
const mid = left + (right - left) / 2;
// Compare the key with the midpoint element
switch (compareFn(key, items[mid])) {
.eq => return mid,
.gt => left = mid + 1,
- .lt => right = mid - 1,
+ .lt => right = mid,
}
}
@@ -48,6 +45,10 @@ test "std.sort.binarySearch" {
binarySearch(u32, 1, &[_]u32{0}, S.order_u32),
);
testing.expectEqual(
+ @as(?usize, null),
+ binarySearch(u32, 0, &[_]u32{1}, S.order_u32),
+ );
+ testing.expectEqual(
@as(?usize, 4),
binarySearch(u32, 5, &[_]u32{ 1, 2, 3, 4, 5 }, S.order_u32),
);