https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78969
John Lindgren <john at jlindgren dot net> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |john at jlindgren dot net
--- Comment #11 from John Lindgren <john at jlindgren dot net> ---
I think I am hitting the same issue in 8.1.0. Input ranges are thoroughly
checked in the below code, and there is no possibility of truncation, yet a
warning is emitted.
>From reading this and other reports, it seems to come down to random chance
whether -Wformat-truncation is reliable or not, as it depends on range data in
the optimizer that was never intended for error-checking diagnostics.
Can you please remove -Wformat-truncation from -Wall until it actually works?
#include <stdio.h>
void format_time (char buf[7], int time)
{
if (time < 0) time = 0;
if (time > 3599999) time = 3599999;
if (time < 6000)
snprintf (buf, 7, " %02d:%02d", time / 60, time % 60);
else if (time < 60000)
snprintf (buf, 7, "%3d:%02d", time / 60, time % 60);
else
snprintf (buf, 7, "%3d:%02d", time / 3600, time / 60 % 60);
}
$ gcc -Wall -O2 -c test.c
test.c: In function ‘format_time’:
test.c:11:32: warning: ‘%02d’ directive output may be truncated writing 2 bytes
into a region of size between 1 and 3 [-Wformat-truncation=]
snprintf (buf, 7, "%3d:%02d", time / 60, time % 60);
^~~~
test.c:11:27: note: directive argument in the range [0, 59]
snprintf (buf, 7, "%3d:%02d", time / 60, time % 60);
^~~~~~~~~~
test.c:11:9: note: ‘snprintf’ output between 7 and 9 bytes into a destination
of size 7
snprintf (buf, 7, "%3d:%02d", time / 60, time % 60);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~