From: Brian Kessler Date: Wed, 14 Nov 2018 05:51:21 +0000 (-0700) Subject: math/bits: define Div to panic when y<=hi X-Git-Tag: go1.12beta1~263 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=979d9027aecf265214a6dcc27fe037bfd70355f2;p=gostls13.git math/bits: define Div to panic when y<=hi Div panics when y<=hi because either the quotient overflows the size of the output or division by zero occurs when y==0. This provides a uniform behavior for all implementations. Fixes #28316 Change-Id: If23aeb10e0709ee1a60b7d614afc9103d674a980 Reviewed-on: https://go-review.googlesource.com/c/149517 Reviewed-by: Robert Griesemer --- diff --git a/src/math/bits/bits.go b/src/math/bits/bits.go index fbf4966157..9da1c6e580 100644 --- a/src/math/bits/bits.go +++ b/src/math/bits/bits.go @@ -454,8 +454,7 @@ func Mul64(x, y uint64) (hi, lo uint64) { // Div returns the quotient and remainder of (hi, lo) divided by y: // quo = (hi, lo)/y, rem = (hi, lo)%y with the dividend bits' upper // half in parameter hi and the lower half in parameter lo. -// hi must be < y otherwise the behavior is undefined (the quotient -// won't fit into quo). +// Div panics for y == 0 (division by zero) or y <= hi (quotient overflow). func Div(hi, lo, y uint) (quo, rem uint) { if UintSize == 32 { q, r := Div32(uint32(hi), uint32(lo), uint32(y)) @@ -468,8 +467,7 @@ func Div(hi, lo, y uint) (quo, rem uint) { // Div32 returns the quotient and remainder of (hi, lo) divided by y: // quo = (hi, lo)/y, rem = (hi, lo)%y with the dividend bits' upper // half in parameter hi and the lower half in parameter lo. -// hi must be < y otherwise the behavior is undefined (the quotient -// won't fit into quo). +// Div32 panics for y == 0 (division by zero) or y <= hi (quotient overflow). func Div32(hi, lo, y uint32) (quo, rem uint32) { if y != 0 && y <= hi { panic(overflowError) @@ -482,8 +480,7 @@ func Div32(hi, lo, y uint32) (quo, rem uint32) { // Div64 returns the quotient and remainder of (hi, lo) divided by y: // quo = (hi, lo)/y, rem = (hi, lo)%y with the dividend bits' upper // half in parameter hi and the lower half in parameter lo. -// hi must be < y otherwise the behavior is undefined (the quotient -// won't fit into quo). +// Div64 panics for y == 0 (division by zero) or y <= hi (quotient overflow). func Div64(hi, lo, y uint64) (quo, rem uint64) { const ( two32 = 1 << 32