diff options
author | Ian Lance Taylor <iant@golang.org> | 2008-09-29 13:40:23 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2008-09-29 13:40:23 -0700 |
commit | d5ed4f05a77104d8d3d8401d98f39ebb143769c6 (patch) | |
tree | a8a2d26a43f29bf3a369e6c1c754fae18511c850 /src/lib/strings.go | |
parent | 89e9ecebce88654474c8c34e0f478687821f1c14 (diff) | |
download | golang-d5ed4f05a77104d8d3d8401d98f39ebb143769c6.tar.gz |
Use unsigned int in itoa to avoid relying on the behaviour of
signed integer overflow when negating the most negative
integer.
R=rsc
DELTA=11 (0 added, 7 deleted, 4 changed)
OCL=16105
CL=16120
Diffstat (limited to 'src/lib/strings.go')
-rw-r--r-- | src/lib/strings.go | 15 |
1 files changed, 4 insertions, 11 deletions
diff --git a/src/lib/strings.go b/src/lib/strings.go index a4e81b354..4a2184341 100644 --- a/src/lib/strings.go +++ b/src/lib/strings.go @@ -168,30 +168,23 @@ export func itoa(i int) string { } neg := false; // negative - bigneg := false; // largest negative number + u := uint(i); if i < 0 { neg = true; - i = -i; - if i < 0 { - bigneg = true; // is largest negative int - i-- // now positive - } + u = -u; } // Assemble decimal in reverse order. var b [32]byte; bp := len(b); - for ; i > 0; i /= 10 { + for ; u > 0; u /= 10 { bp--; - b[bp] = byte(i%10) + '0' + b[bp] = byte(u%10) + '0' } if neg { // add sign bp--; b[bp] = '-' } - if bigneg { // account for i-- above - b[len(b)-1]++ - } // BUG return string(b[bp:len(b)]) return string((&b)[bp:len(b)]) |