| /* { dg-do compile } |
| { dg-options "-O2 -Wall" } */ |
| |
| typedef __SIZE_TYPE__ size_t; |
| |
| void* malloc (size_t); |
| void* memcpy (void*, const void*, size_t); |
| size_t strlen (const char *); |
| |
| // Test case reduced from gcc/attribs.c. |
| |
| char* sorted_attr_string (char *argv[]) |
| { |
| size_t n = 0; |
| unsigned int i; |
| |
| for (i = 0; argv[i]; ++i) |
| n += strlen (argv[i]); |
| |
| char *s = (char*)malloc (n); |
| n = 0; |
| for (i = 0; argv[i]; ++i) |
| { |
| const char *str = argv[i]; |
| size_t len = strlen (str); |
| memcpy (s + n, str, len); |
| n += len + 1; |
| } |
| |
| /* Replace "=,-" with "_". */ |
| for (i = 0; i < strlen (s); i++) |
| if (s[i] == '=') |
| s[i] = '_'; // { dg-bogus "\\\[-Wstringop-overflow" } |
| |
| return s; |
| } |
| |
| |
| void f (void*); |
| |
| void nowarn_cond_escape (int c, int *x) |
| { |
| extern char a3[3], a5[5]; |
| |
| char *p; |
| if (c) |
| { |
| p = a3; |
| *x = 2; |
| } |
| else |
| { |
| p = a5; |
| *x = 4; |
| } |
| |
| f (p); // may modify *x |
| |
| if (*x == 2) |
| p[2] = 0; |
| else if (*x == 4) |
| p[4] = 0; // { dg-bogus "\\\[-Wstringop-overflow" } |
| } |
| |
| void warn_cond_escape (int c, int *x) |
| { |
| extern char a3_2[3]; |
| extern char a5_2[5]; // { dg-message "at offset 5 into object 'a5_2'" } |
| |
| char *p; |
| if (c) |
| { |
| p = a3_2; |
| *x = 2; |
| } |
| else |
| { |
| p = a5_2; |
| *x = 5; |
| } |
| |
| f (p); // may modify *x |
| |
| if (*x == 2) |
| p[2] = 0; |
| else if (*x == 5) |
| p[5] = 0; // { dg-warning "\\\[-Warray-bounds|-Wstringop-overflow" } |
| } |