From: Ian Lance Taylor Date: Mon, 29 Sep 2008 20:40:23 +0000 (-0700) Subject: Use unsigned int in itoa to avoid relying on the behaviour of X-Git-Tag: weekly.2009-11-06~3085 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=489b5001e22ceb1faf7624a70d17247f0b15113d;p=gostls13.git 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 --- diff --git a/src/lib/strings.go b/src/lib/strings.go index a4e81b3544..4a2184341f 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)])