| /* Verify -Wstringop-overread with a source pointer pointing either |
| before the beginning or past the end of an object. |
| { dg-do compile } |
| { dg-options "-O -Wall" } */ |
| |
| typedef __SIZE_TYPE__ size_t; |
| |
| size_t strlen (const char *); |
| |
| |
| extern char a[1]; |
| |
| volatile size_t n; |
| |
| void len_si_1_max (int i) |
| { |
| if (i < 1) i = 1; |
| n = strlen (a + i); // { dg-warning "reading 1 or more bytes from a region of size 0" } |
| n = strlen (a + i + 1); // { dg-warning "reading 1 or more bytes from a region of size 0" } |
| } |
| |
| void len_ui_1_max (unsigned i) |
| { |
| if (i < 1) i = 1; |
| n = strlen (a + i); // { dg-warning "reading 1 or more bytes from a region of size 0" } |
| n = strlen (a + i + 1); // { dg-warning "reading 1 or more bytes from a region of size 0" "" { xfail ilp32 } } |
| } |
| |
| void len_sl_1_max (long i) |
| { |
| if (i < 1) i = 1; |
| n = strlen (a + i); // { dg-warning "reading 1 or more bytes from a region of size 0" } |
| n = strlen (a + i + 1); // { dg-warning "reading 1 or more bytes from a region of size 0" } |
| } |
| |
| void len_ul_1_max (unsigned long i) |
| { |
| if (i < 1) i = 1; |
| n = strlen (a + i); // { dg-warning "reading 1 or more bytes from a region of size 0" } |
| n = strlen (a + i + 1); // { dg-warning "reading 1 or more bytes from a region of size 0" "" { xfail *-*-* } } |
| } |
| |
| |
| void len_si_min_m1 (int i) |
| { |
| if (i > -1) i = -1; |
| n = strlen (a + i - 1); // { dg-warning "reading 1 or more bytes from a region of size 0" "" { xfail lp64 } } |
| n = strlen (a + i); // { dg-warning "reading 1 or more bytes from a region of size 0" "" { xfail *-*-* } } |
| n = strlen (a + i + 2); |
| } |
| |
| void len_sl_min_m1 (long i) |
| { |
| if (i > -1) i = -1; |
| n = strlen (a + i - 1); // { dg-warning "reading 1 or more bytes from a region of size 0" } |
| n = strlen (a + i); // { dg-warning "reading 1 or more bytes from a region of size 0" "" { xfail *-*-* } } |
| n = strlen (a + i + 2); |
| } |