https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78696
Bug ID: 78696
Summary: [7 Regression] -fprintf-return-value misoptimizes %.Ng
where N is greater than 10
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: jgreenhalgh at gcc dot gnu.org
Target Milestone: ---
For this testcase:
#include <stdio.h>
int __attribute__ ((noinline))
wrap_snprintf (char *buffer, size_t size, double value)
{
int ret = snprintf(buffer, size, "%.17g", value);
return ret;
}
int main ()
{
char x[100] = {0};
char y[100] = {0};
int ret = wrap_snprintf (x, 100, 1.0);
int ret2 = wrap_snprintf (y, 100, -1.0);
printf ("%d\t%s\n%d\t%s\n", ret, x, ret2, y);
}
GCC trunk will create (-O3) a binary which prints:
19 1
19 -1
Which is wrong.
GCC 5, and trunk with -fno-printf-return-value prints
1 1
2 -1
The choice of 1.0 is not special, GCC always assumes the size of the string
which will be printed by "%.17g" will be 19 characters long, and optimizes the
return value of wrap_snprintf to 19. 19 is the correct maximum length of the
string, but not the minimum, so this optimization is invalid.
Interestingly, for "%.10g", "%.9g" etc. trunk gets this right. It is "%.11g"
and above that cause issues.