| /* PR sanitizer/80998 */ |
| /* { dg-do run } */ |
| /* { dg-options "-fsanitize=pointer-overflow -fno-sanitize-recover=pointer-overflow -Wall" } */ |
| |
| struct S { int a; int b; int c[64]; }; |
| __attribute__((noinline, noclone)) char *f1 (char *p) { return p + 1; } |
| __attribute__((noinline, noclone)) char *f2 (char *p) { return p - 1; } |
| __attribute__((noinline, noclone)) char *f3 (char *p, int i) { return p + i; } |
| __attribute__((noinline, noclone)) char *f4 (char *p, int i) { return p - i; } |
| __attribute__((noinline, noclone)) char *f5 (char *p, unsigned long int i) { return p + i; } |
| __attribute__((noinline, noclone)) char *f6 (char *p, unsigned long int i) { return p - i; } |
| __attribute__((noinline, noclone)) int *f7 (struct S *p) { return &p->a; } |
| __attribute__((noinline, noclone)) int *f8 (struct S *p) { return &p->b; } |
| __attribute__((noinline, noclone)) int *f9 (struct S *p) { return &p->c[64]; } |
| __attribute__((noinline, noclone)) int *f10 (struct S *p, int i) { return &p->c[i]; } |
| |
| char *volatile p; |
| struct S *volatile q; |
| char a[64]; |
| struct S s; |
| int *volatile r; |
| |
| int |
| main () |
| { |
| struct S t; |
| p = &a[32]; |
| p = f1 (p); |
| p = f1 (p); |
| p = f2 (p); |
| p = f3 (p, 1); |
| p = f3 (p, -1); |
| p = f3 (p, 3); |
| p = f3 (p, -6); |
| p = f4 (p, 1); |
| p = f4 (p, -1); |
| p = f4 (p, 3); |
| p = f4 (p, -6); |
| p = f5 (p, 1); |
| p = f5 (p, 3); |
| p = f6 (p, 1); |
| p = f6 (p, 3); |
| if (sizeof (unsigned long) >= sizeof (char *)) |
| { |
| p = f5 (p, -1); |
| p = f5 (p, -6); |
| p = f6 (p, -1); |
| p = f6 (p, -6); |
| } |
| q = &s; |
| r = f7 (q); |
| r = f8 (q); |
| r = f9 (q); |
| r = f10 (q, 0); |
| r = f10 (q, 10); |
| r = f10 (q, 64); |
| q = &t; |
| r = f7 (q); |
| r = f8 (q); |
| r = f9 (q); |
| r = f10 (q, 0); |
| r = f10 (q, 10); |
| r = f10 (q, 64); |
| return 0; |
| } |