This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: format-truncation warning with -O2 on gcc 7.1.1
- From: Jonathan Wakely <jwakely dot gcc at gmail dot com>
- To: Pico Geyer <picogeyer at gmail dot com>
- Cc: gcc-help <gcc-help at gcc dot gnu dot org>
- Date: Thu, 22 Jun 2017 15:31:38 +0100
- Subject: Re: format-truncation warning with -O2 on gcc 7.1.1
- Authentication-results: sourceware.org; auth=none
- References: <CAPPm2VrK5b0f2N6+pQHQMjvARpH3PoT9xtFa-ry_30wZTpNJQQ@mail.gmail.com>
On 22 June 2017 at 15:06, Pico Geyer wrote:
> Hi all.
>
> I'm using g++ version 7.1.1 20170528 on Arch linux.
> I've been rather surprised by a warning (turned into error by -Werror)
> that only occurs when compiling with -O2
> I've extracted this sample which seems to exhibit the same behaviour:
> ---------------------------------------------
> #include "stdio.h"
> int get_amt()
> {
> int i;
> int r = scanf("%d", &i);
> if( r != 1) {
> //Some error
> }
> return i;
> }
>
> void standalone()
> {
> char str[10];
> int amt = 0;
> amt = get_amt();
> /*XXX If I comment out this if block then no compile errors ?? */
> if ( amt == 0 )
> return;
> snprintf( str, 10, "%d", (amt - 1) );
> }
> ---------------------------------------------
> g++ -c -O2 -Werror -Wall test.cpp
> test.cpp: In function ‘void standalone()’:
> test.cpp:12:6: error: ‘%d’ directive output may be truncated writing
> between 1 and 11 bytes into a region of size 10
> [-Werror=format-truncation=]
> void standalone()
> ^~~~~~~~~~
> test.cpp:12:6: note: directive argument in the range [-2147483648, 2147483646]
> test.cpp:20:13: note: ‘snprintf’ output between 2 and 12 bytes into a
> destination of size 10
> snprintf( str, 10, "%d", (amt - 1) );
> ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> ---------------------------------------------
> However if I compile with -O1:
> g++ -c -O1 -Werror -Wall test.cpp
> #No errors.
>
> Could this be a g++ bug? (I didn't want to risk filing a bug if it isn't one)
No.
> If it is a legitimate warning, why is it only issued with -O2 ?
Because the analysis that is needed to detect the bug only happens
when certain optimisations are enabled.
> I don't get this warning/error with older versions of g++ (Tested
> 6.3.0 and 5.4).
Because the -Wformat-overflow warnings are new in GCC 7, i.e. GCC got
better. See https://gcc.gnu.org/gcc-7/changes.html#c-family