| /* PR tree-optimization/78969 - bogus snprintf truncation warning due to |
| missing range info |
| { dg-do compile } |
| { dg-options "-O2 -Wall -Wformat-truncation=2" } */ |
| |
| typedef __SIZE_TYPE__ size_t; |
| |
| extern int snprintf (char*, size_t, const char*, ...); |
| |
| |
| void f (unsigned j, char *p) |
| { |
| if (j > 999) |
| j = 0; |
| |
| snprintf (p, 4, "%3u", j); |
| } |
| |
| void g (unsigned j, char *p) |
| { |
| if (j > 999) |
| return; |
| |
| snprintf (p, 4, "%3u", j); // { dg-bogus "-Wformat-truncation" } |
| } |
| |
| |
| void pr78969_c4 (char * p /* NNN\0" */) |
| { |
| for (int idx = 0; idx < 1000; idx++) { |
| // guaranteed to be in [0-999] range |
| snprintf (p, 4, "%d", idx); // { dg-bogus "-Wformat-truncation" } |
| } |
| } |
| |
| |
| void sink (int, ...); |
| |
| char d[4]; |
| |
| void pr78969_c12 (unsigned i) |
| { |
| if (i >= 1000 && i < 10000) |
| snprintf (d, 4, "%3d", i / 10); // { dg-bogus "-Wformat-truncation" } |
| else |
| sink (i / 10 % 10); |
| } |