From 489b5001e22ceb1faf7624a70d17247f0b15113d Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 29 Sep 2008 13:40:23 -0700 Subject: [PATCH] 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 --- src/lib/strings.go | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) 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)]) -- 2.50.0