Fix warning from latest GCC in tst-printf.c

Message ID 1477003405.8523.21.camel@caviumnetworks.com
State New, archived
Headers

Commit Message

Steve Ellcey Oct. 20, 2016, 10:43 p.m. UTC
  GCC 7.0 (prerelease) adds a a new warning, -Wformat-length, if it
thinks an snprintf call may go beyond the end of the buffer length
being written to.  This warning is an approximation since GCC may not
know how many characters a '%d' format will expand to, but it makes a
worse case guess and warns if that would take the print beyond the
buffer length.

Here is a fix for one GLIBC test that fails to compile due to this
warning.  I think we want to ignore the warning in this case and not
increase the buffer size because I believe the test is intentionally
trying to go beyond the buffer limit.

The warnings are coming from the snprintf statements at line 225 and
228 of the original stdio-common/tst-printf.c and I could do a push and
pop of the warning down at those lines but I thought it made more sense
to put it up with the other DIAG_IGNORE.

OK to checkin?

Steve Ellcey
sellcey@caviumnetworks.com


2016-10-20  Steve Ellcey  <sellcey@caviumnetworks.com>

	* stdio-common/tst-printf.c: Ignore -Wformat-length warning.
  

Comments

Steve Ellcey Nov. 1, 2016, 5:21 p.m. UTC | #1
Ping.  One of the snprintf statements in this test is using a %.999999u
format so it is obvious that the test wants to test formats that would
go beyond the limit of the snprintf buffer and so we should ignore the
warnings in this test.

Steve Ellcey
sellcey@caviumnetworks.com



On Thu, 2016-10-20 at 15:43 -0700, Steve Ellcey wrote:
> GCC 7.0 (prerelease) adds a a new warning, -Wformat-length, if it
> thinks an snprintf call may go beyond the end of the buffer length
> being written to.  This warning is an approximation since GCC may not
> know how many characters a '%d' format will expand to, but it makes a
> worse case guess and warns if that would take the print beyond the
> buffer length.
> 
> Here is a fix for one GLIBC test that fails to compile due to this
> warning.  I think we want to ignore the warning in this case and not
> increase the buffer size because I believe the test is intentionally
> trying to go beyond the buffer limit.
> 
> The warnings are coming from the snprintf statements at line 225 and
> 228 of the original stdio-common/tst-printf.c and I could do a push
> and
> pop of the warning down at those lines but I thought it made more
> sense
> to put it up with the other DIAG_IGNORE.
> 
> OK to checkin?
> 
> Steve Ellcey
> sellcey@caviumnetworks.com
> 
> 
> 2016-10-20  Steve Ellcey  <sellcey@caviumnetworks.com>
> 
> 	* stdio-common/tst-printf.c: Ignore -Wformat-length warning.
> 
> 
> diff --git a/stdio-common/tst-printf.c b/stdio-common/tst-printf.c
> index 2896b18..1ae1eea 100644
> --- a/stdio-common/tst-printf.c
> +++ b/stdio-common/tst-printf.c
> @@ -32,6 +32,9 @@
>     The compiler warnings are not useful here.  */
>  DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat");
>  
> +/* Compiler warnings about format lengths should also be
> ignored.  */
> +DIAG_IGNORE_NEEDS_COMMENT (7.0, "-Wformat-length");
> +
>  static void rfg1 (void);
>  static void rfg2 (void);
>  static void rfg3 (void);
  
Joseph Myers Nov. 1, 2016, 5:37 p.m. UTC | #2
On Tue, 1 Nov 2016, Steve Ellcey wrote:

> Ping.  One of the snprintf statements in this test is using a %.999999u
> format so it is obvious that the test wants to test formats that would
> go beyond the limit of the snprintf buffer and so we should ignore the
> warnings in this test.

OK provided you've tested that this change works with older GCC that lack 
the new option (otherwise it would need to be conditional on the GCC 
version).
  

Patch

diff --git a/stdio-common/tst-printf.c b/stdio-common/tst-printf.c
index 2896b18..1ae1eea 100644
--- a/stdio-common/tst-printf.c
+++ b/stdio-common/tst-printf.c
@@ -32,6 +32,9 @@ 
    The compiler warnings are not useful here.  */
 DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat");
 
+/* Compiler warnings about format lengths should also be ignored.  */
+DIAG_IGNORE_NEEDS_COMMENT (7.0, "-Wformat-length");
+
 static void rfg1 (void);
 static void rfg2 (void);
 static void rfg3 (void);