Go patch committed: Avoid silent integer truncation in compiler

Ian Lance Taylor iant@golang.org
Wed Nov 25 16:02:48 GMT 2020


This patch to the Go frontend avoids silent integer truncation when
compiling code like string(1 << 32).  In the conversion of a constant
integer to a string type, the value of the constant integer was being
silently truncated from unsigned long to unsigned int, producing the
wrong string value.  This patch adds an explicit overflow check to
avoid this problem.  This is for https://golang.org/issue/42790.
Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu.  Committed
to mainline.

Ian
-------------- next part --------------
c9525352984b5ded5ce444969dae67d93f7748f8
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index 3e94dabcd30..c14ee7e7b14 100644
--- a/gcc/go/gofrontend/MERGE
+++ b/gcc/go/gofrontend/MERGE
@@ -1,4 +1,4 @@
-78c9a657fdbc9e812d39910fb93fbae4affe4360
+8cbe18aff99dbf79bd1adb9c025418e84505ffd5
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index 6bc93488939..448888b0ad7 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -4024,8 +4024,16 @@ Type_conversion_expression::do_string_constant_value(std::string* val) const
 	  unsigned long ival;
 	  if (nc.to_unsigned_long(&ival) == Numeric_constant::NC_UL_VALID)
 	    {
+	      unsigned int cval = static_cast<unsigned int>(ival);
+	      if (static_cast<unsigned long>(cval) != ival)
+		{
+		  go_warning_at(this->location(), 0,
+				"unicode code point 0x%lx out of range",
+				ival);
+		  cval = 0xfffd; // Unicode "replacement character."
+		}
 	      val->clear();
-	      Lex::append_char(ival, true, val, this->location());
+	      Lex::append_char(cval, true, val, this->location());
 	      return true;
 	    }
 	}


More information about the Gcc-patches mailing list