| /* { dg-do run } */ |
| /* { dg-skip-if "" { *-*-* } { "*" } { "-O2" } } */ |
| /* { dg-options "-fsanitize=object-size -fno-sanitize-recover=object-size" } */ |
| |
| /* Test valid uses. */ |
| |
| #define N 20 |
| |
| __attribute__((noinline, noclone)) void |
| f1 (int i) |
| { |
| volatile int j; |
| char *p, *orig; |
| orig = p = (char *) __builtin_calloc (N, 1); |
| j = *(p + i); |
| j = p[i]; |
| p++; |
| j = p[i - 1]; |
| j = *(p + i - 1); |
| __builtin_free (orig); |
| } |
| |
| __attribute__((noinline, noclone)) void |
| f2 (int i) |
| { |
| volatile int j; |
| char a[N]; |
| __builtin_memset (a, 0, N); |
| j = *(a + i); |
| char *p = a; |
| j = *(p + i); |
| j = p[i]; |
| p += 10; |
| j = *(p + i - 10); |
| j = p[i - 10]; |
| } |
| |
| __attribute__((noinline, noclone)) void |
| f3 (int i) |
| { |
| volatile int j; |
| int *p = (int *) __builtin_calloc (N, sizeof (*p)); |
| int *o = &p[i]; |
| j = *o; |
| j = o[0]; |
| __builtin_free (p); |
| } |
| |
| int |
| main () |
| { |
| f1 (N - 1); |
| f2 (N - 1); |
| f3 (N - 1); |
| return 0; |
| } |