Skip to content

Commit f30e7a8

Browse files
committed
fixed rotation of 0-length vectors
fixes #33
1 parent 94ac6c6 commit f30e7a8

File tree

3 files changed

+12
-5
lines changed

3 files changed

+12
-5
lines changed

CHANGES.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11

2+
- fixed division by zero in rotations of 0-length vectors
3+
(reported by Nikolaus Huber)
24
- fixed integer overflows in bound tests in `fill`, `blit`, `sub`
35
(fix by Nikolaus Huber)
46

bitv.ml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -406,10 +406,10 @@ let rec rotatel v d =
406406
rotater v (-d)
407407
else
408408
let n = v.length in
409-
let d = d mod n in
410-
if d == 0 then
409+
if d == 0 || n == 0 then
411410
copy v
412411
else begin
412+
let d = d mod n in
413413
let r = create n false in
414414
unsafe_blit v.bits 0 r.bits d (n - d); (* shiftl *)
415415
unsafe_blit v.bits (n - d) r.bits 0 d; (* wraparound ms to ls *)
@@ -421,10 +421,10 @@ and rotater v d =
421421
rotatel v (-d)
422422
else
423423
let n = v.length in
424-
let d = d mod n in
425-
if d == 0 then
424+
if d == 0 || n == 0 then
426425
copy v
427426
else begin
427+
let d = d mod n in
428428
let r = create n false in
429429
unsafe_blit v.bits d r.bits 0 (n - d); (* shiftr *)
430430
unsafe_blit v.bits 0 r.bits (n - d) d; (* wraparound ls to ms *)

test.ml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,12 @@ let () =
9090
let v = of_string "110101110" in
9191
assert (equal (rotatel v 1) (of_string "101011101"));
9292
assert (equal (rotatel v (-1)) (of_string "011010111"));
93-
assert (equal (rotater v 1) (of_string "011010111"))
93+
assert (equal (rotater v 1) (of_string "011010111"));
94+
(* 0-length rotation *)
95+
let v = create 0 false in
96+
assert (length (rotatel v 0) = 0);
97+
assert (length (rotater v 0) = 0);
98+
()
9499

95100
let test_rotate n =
96101
let v = init n (fun _ -> Random.bool ()) in

0 commit comments

Comments
 (0)