1 /* PR sanitizer/81094 */
2 /* { dg-do run } */
3 /* { dg-skip-if "" { *-*-* } { "*" } { "-O2" } } */
4 /* { dg-options "-fsanitize=object-size" } */
5 
6 #define N 20
7 
8 struct S { int i; };
9 
10 __attribute__((noinline, noclone)) void
f0(struct S s)11 f0 (struct S s)
12 {
13   asm volatile ("" : : "r" (s.i) : "memory");
14 }
15 
16 __attribute__((noinline, noclone)) void
f1(int i)17 f1 (int i)
18 {
19   char *orig;
20   struct S *p;
21   orig = (char *) __builtin_calloc (N, sizeof (struct S));
22   p = (struct S *) orig;
23   f0 (*(p + i));
24   f0 (p[i]);
25   p++;
26   f0 (p[i - 1]);
27   f0 (*(p + i - 1));
28   __builtin_free (orig);
29 }
30 
31 /* { dg-output "load of address \[^\n\r]* with insufficient space for an object of type 'struct S'\[^\n\r]*(\n|\r\n|\r)" } */
32 /* { dg-output "\[^\n\r]*note: pointer points here\[^\n\r]*(\n|\r\n|\r)" } */
33 /* { dg-output "\[^\n\r]*\[^\n\r]*(\n|\r\n|\r)" } */
34 /* { dg-output "\[^\n\r]*\\^\[^\n\r]*(\n|\r\n|\r)" } */
35 /* { dg-output "\[^\n\r]*load of address \[^\n\r]* with insufficient space for an object of type 'struct S'\[^\n\r]*(\n|\r\n|\r)" } */
36 /* { dg-output "\[^\n\r]*note: pointer points here\[^\n\r]*(\n|\r\n|\r)" } */
37 /* { dg-output "\[^\n\r]*\[^\n\r]*(\n|\r\n|\r)" } */
38 /* { dg-output "\[^\n\r]*\\^\[^\n\r]*(\n|\r\n|\r)" } */
39 /* { dg-output "\[^\n\r]*load of address \[^\n\r]* with insufficient space for an object of type 'struct S'\[^\n\r]*(\n|\r\n|\r)" } */
40 /* { dg-output "\[^\n\r]*note: pointer points here\[^\n\r]*(\n|\r\n|\r)" } */
41 /* { dg-output "\[^\n\r]*\[^\n\r]*(\n|\r\n|\r)" } */
42 /* { dg-output "\[^\n\r]*\\^\[^\n\r]*(\n|\r\n|\r)" } */
43 /* { dg-output "\[^\n\r]*load of address \[^\n\r]* with insufficient space for an object of type 'struct S'\[^\n\r]*(\n|\r\n|\r)" } */
44 /* { dg-output "\[^\n\r]*note: pointer points here\[^\n\r]*(\n|\r\n|\r)" } */
45 /* { dg-output "\[^\n\r]*\[^\n\r]*(\n|\r\n|\r)" } */
46 /* { dg-output "\[^\n\r]*\\^" } */
47 
48 int
main()49 main ()
50 {
51   f1 (N);
52   return 0;
53 }
54