diff mbox series

make -Wformat-overflow consistent between data models

Message ID 24ae4245-ff17-4159-2bf4-c974b3ad823c@gmail.com
State New
Headers show
Series make -Wformat-overflow consistent between data models | expand

Commit Message

Martin Sebor Feb. 23, 2019, 2:25 a.m. UTC
A few tests recently added for PR 88993 introduced an assumption
on the host compiler's data model that breaks between ILP32 and
LP64, causing failures test run failures
(see https://gcc.gnu.org/ml/gcc-patches/2019-02/msg01867.html).
Rather than avoiding the problem in the tests the attached patch
removes the data model assumption from the sprintf pass itself,
making the warnings emitted by the pass consistent regardless.

Bootstrapped and tested on x86_64-linux, and smoke-tested with
an i386-linux GCC.

Martin

Comments

Jakub Jelinek Feb. 23, 2019, 8:22 a.m. UTC | #1
On Fri, Feb 22, 2019 at 07:25:53PM -0700, Martin Sebor wrote:
> A few tests recently added for PR 88993 introduced an assumption
> on the host compiler's data model that breaks between ILP32 and
> LP64, causing failures test run failures
> (see https://gcc.gnu.org/ml/gcc-patches/2019-02/msg01867.html).
> Rather than avoiding the problem in the tests the attached patch
> removes the data model assumption from the sprintf pass itself,
> making the warnings emitted by the pass consistent regardless.
> 
> Bootstrapped and tested on x86_64-linux, and smoke-tested with
> an i386-linux GCC.
> 
> Martin

> gcc/ChangeLog:
> 
> 	* gimple-ssa-sprintf.c (target_strtol): Rename...
> 	(target_strtohwi): ...to this.  Handle values up to HOST_WIDE_INT_MAX.
> 	(parse_directive): Adjust to name change.  Use HOST_WIDE_INT_MAX to
> 	check for range error.

Ok.

	Jakub
diff mbox series

Patch

gcc/ChangeLog:

	* gimple-ssa-sprintf.c (target_strtol): Rename...
	(target_strtohwi): ...to this.  Handle values up to HOST_WIDE_INT_MAX.
	(parse_directive): Adjust to name change.  Use HOST_WIDE_INT_MAX to
	check for range error.

Index: gcc/gimple-ssa-sprintf.c
===================================================================
--- gcc/gimple-ssa-sprintf.c	(revision 269136)
+++ gcc/gimple-ssa-sprintf.c	(working copy)
@@ -411,12 +411,12 @@  target_to_host (char *hostr, size_t hostsz, const
 }
 
 /* Convert the sequence of decimal digits in the execution character
-   starting at S to a long, just like strtol does.  Return the result
-   and set *END to one past the last converted character.  On range
-   error set ERANGE to the digit that caused it.  */
+   starting at *PS to a HOST_WIDE_INT, analogously to strtol.  Return
+   the result and set *PS to one past the last converted character.
+   On range error set ERANGE to the digit that caused it.  */
 
-static inline long
-target_strtol10 (const char **ps, const char **erange)
+static inline HOST_WIDE_INT
+target_strtowi (const char **ps, const char **erange)
 {
   unsigned HOST_WIDE_INT val = 0;
   for ( ; ; ++*ps)
@@ -427,9 +427,9 @@  target_to_host (char *hostr, size_t hostsz, const
 	  c -= '0';
 
 	  /* Check for overflow.  */
-	  if (val > (LONG_MAX - c) / 10LU)
+	  if (val > ((unsigned HOST_WIDE_INT) HOST_WIDE_INT_MAX - c) / 10LU)
 	    {
-	      val = LONG_MAX;
+	      val = HOST_WIDE_INT_MAX;
 	      *erange = *ps;
 
 	      /* Skip the remaining digits.  */
@@ -3149,7 +3149,7 @@  parse_directive (sprintf_dom_walker::call_info &in
 	 width and sort it out later after the next character has
 	 been seen.  */
       pwidth = pf;
-      width = target_strtol10 (&pf, &werange);
+      width = target_strtowi (&pf, &werange);
     }
   else if (target_to_host (*pf) == '*')
     {
@@ -3231,7 +3231,7 @@  parse_directive (sprintf_dom_walker::call_info &in
 	{
 	  werange = 0;
 	  pwidth = pf;
-	  width = target_strtol10 (&pf, &werange);
+	  width = target_strtowi (&pf, &werange);
 	}
       else if (target_to_host (*pf) == '*')
 	{
@@ -3264,7 +3264,7 @@  parse_directive (sprintf_dom_walker::call_info &in
       if (ISDIGIT (target_to_host (*pf)))
 	{
 	  pprec = pf;
-	  precision = target_strtol10 (&pf, &perange);
+	  precision = target_strtowi (&pf, &perange);
 	}
       else if (target_to_host (*pf) == '*')
 	{
@@ -3418,7 +3418,7 @@  parse_directive (sprintf_dom_walker::call_info &in
     }
   else
     {
-      if (width == LONG_MAX && werange)
+      if (width == HOST_WIDE_INT_MAX && werange)
 	{
 	  size_t begin = dir.beg - info.fmtstr + (pwidth - pcnt);
 	  size_t caret = begin + (werange - pcnt);
@@ -3451,7 +3451,7 @@  parse_directive (sprintf_dom_walker::call_info &in
     }
   else
     {
-      if (precision == LONG_MAX && perange)
+      if (precision == HOST_WIDE_INT_MAX && perange)
 	{
 	  size_t begin = dir.beg - info.fmtstr + (pprec - pcnt) - 1;
 	  size_t caret = dir.beg - info.fmtstr + (perange - pcnt) - 1;