/* PR tree-optimization/87756 - missing unterminated argument warning using address of a constant character { dg-do compile } { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */ int sprintf (char*, const char*, ...); extern char* dest (void); extern void sink (int, ...); #define D dest () #define T(expr) sink (0, (expr)) const char cnul = '\0'; const char cnonul = 'a'; const char str3[] = "123"; const struct { char a, b, s[3]; } s1 = { '\0', 'b', "123" }, s2[2] = { { '\0', 'c', "12" }, { 'd', '\0', "123" } }; void test_sprintf_s (void) { T (sprintf (D, "%s", &cnul)); T (sprintf (D, "%s", &cnonul)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%.1s", &cnonul)); T (sprintf (D, "%.2s", &cnonul)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%s", &s1.a)); T (sprintf (D, "%s", &s1.b)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%.1s", &s1.b)); T (sprintf (D, "%.2s", &s1.b)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%s", s1.s)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%.3s", s1.s)); T (sprintf (D, "%.4s", s1.s)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%.2s", s1.s + 1)); T (sprintf (D, "%.3s", s1.s + 1)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%s", &s2[0].a)); T (sprintf (D, "%s", &s2[0].b)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%.1s", &s2[0].b)); T (sprintf (D, "%.2s", &s2[0].b)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%s", s2[0].s)); T (sprintf (D, "%.3s", s2[0].s)); T (sprintf (D, "%.4s", s2[0].s)); T (sprintf (D, "%.2s", s2[0].s + 1)); T (sprintf (D, "%.3s", s2[0].s + 1)); T (sprintf (D, "%s", &s2[1].a)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%.1s", &s2[1].a)); T (sprintf (D, "%.2s", &s2[1].a)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%s", &s2[1].b)); T (sprintf (D, "%s", s2[1].s)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%.3s", s2[1].s)); T (sprintf (D, "%.4s", s2[1].s)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%.2s", s2[1].s + 1)); T (sprintf (D, "%.3s", s2[1].s + 1)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%s", &str3[3])); T (sprintf (D, "%s", &str3[4])); /* { dg-warning "\\\[-Warray-bounds" } */ }