| /* { dg-do run } */ |
| /* { dg-skip-if "" { *-*-* } { "*" } { "-O2" } } */ |
| /* { dg-options "-Wno-stringop-overflow -fsanitize=undefined" } */ |
| |
| /* Test PARM_DECLs and RESULT_DECLs. */ |
| |
| struct T { char d[8]; int e; }; |
| struct T t = { "abcdefg", 1 }; |
| #ifdef __cplusplus |
| struct C { C () : d("abcdefg"), e(1) {} C (const C &x) { __builtin_memcpy (d, x.d, 8); e = x.e; } ~C () {} char d[8]; int e; }; |
| #endif |
| struct U { int a : 5; int b : 19; int c : 8; }; |
| struct S { struct U d[10]; }; |
| struct S s __attribute__ ((aligned(4096))); |
| |
| int |
| f1 (struct T x, int i) |
| { |
| char *p = x.d; |
| p += i; |
| return *p; |
| } |
| |
| /* { dg-output "load of address \[^\n\r]* with insufficient space for an object of type 'char'\[^\n\r]*(\n|\r\n|\r)" } */ |
| /* { dg-output "\[^\n\r]*note: pointer points here\[^\n\r]*(\n|\r\n|\r)" } */ |
| /* { dg-output "\[^\n\r]*\[^\n\r]*(\n|\r\n|\r)" } */ |
| /* { dg-output "\[^\n\r]*\\^\[^\n\r]*(\n|\r\n|\r)" } */ |
| |
| #ifdef __cplusplus |
| static struct C |
| f2 (int i) |
| { |
| struct C x; |
| x.d[i] = 'z'; |
| return x; |
| } |
| |
| /* { dg-output "\[^\n\r]*index 12 out of bounds for type 'char \\\[8\\\]'\[^\n\r]*(\n|\r\n|\r)" { target { c++ } } } */ |
| /* { dg-output "\[^\n\r]*store to address \[^\n\r]* with insufficient space for an object of type 'char'\[^\n\r]*(\n|\r\n|\r)" { target { c++ } } } */ |
| /* { dg-output "\[^\n\r]*note: pointer points here\[^\n\r]*(\n|\r\n|\r)" { target { c++ } } } */ |
| /* { dg-output "\[^\n\r]*\[^\n\r]*(\n|\r\n|\r)" { target { c++ } } } */ |
| /* { dg-output "\[^\n\r]*\\^\[^\n\r]*(\n|\r\n|\r)" { target { c++ } } } */ |
| |
| static struct C |
| f3 (int i) |
| { |
| struct C x; |
| char *p = x.d; |
| p += i; |
| *p = 'z'; |
| return x; |
| } |
| |
| /* { dg-output "\[^\n\r]*store to address \[^\n\r]* with insufficient space for an object of type 'char'\[^\n\r]*(\n|\r\n|\r)" { target { c++ } } } */ |
| /* { dg-output "\[^\n\r]*note: pointer points here\[^\n\r]*(\n|\r\n|\r)" { target { c++ } } } */ |
| /* { dg-output "\[^\n\r]*\[^\n\r]*(\n|\r\n|\r)" { target { c++ } } } */ |
| /* { dg-output "\[^\n\r]*\\^\[^\n\r]*(\n|\r\n|\r)" { target { c++ } } } */ |
| |
| #endif |
| |
| int |
| f4 (int i) |
| { |
| return s.d[i].b; |
| } |
| |
| /* { dg-output "\[^\n\r]*index 12 out of bounds for type 'U \\\[10\\\]'\[^\n\r]*(\n|\r\n|\r)" } */ |
| /* { dg-output "\[^\n\r]*load of address \[^\n\r]* with insufficient space for an object of type 'unsigned int'\[^\n\r]*(\n|\r\n|\r)" } */ |
| /* { dg-output "\[^\n\r]*note: pointer points here\[^\n\r]*(\n|\r\n|\r)" } */ |
| /* { dg-output "\[^\n\r]*\[^\n\r]*(\n|\r\n|\r)" } */ |
| /* { dg-output "\[^\n\r]*\\^\[^\n\r]*(\n|\r\n|\r)" } */ |
| |
| int |
| f5 (int i) |
| { |
| struct U *u = s.d; |
| u += i; |
| return u->b; |
| } |
| |
| /* { dg-output "\[^\n\r]*load of address \[^\n\r]* with insufficient space for an object of type 'unsigned int'\[^\n\r]*(\n|\r\n|\r)" } */ |
| /* { dg-output "\[^\n\r]*note: pointer points here\[^\n\r]*(\n|\r\n|\r)" } */ |
| /* { dg-output "\[^\n\r]*\[^\n\r]*(\n|\r\n|\r)" } */ |
| /* { dg-output "\[^\n\r]*\\^" } */ |
| |
| int |
| main (void) |
| { |
| f1 (t, 12); |
| #ifdef __cplusplus |
| f2 (12); |
| f3 (12); |
| #endif |
| f4 (12); |
| f5 (12); |
| #ifdef __cplusplus |
| /* Stack may be smashed by f2/f3 above. */ |
| __builtin_exit (0); |
| #endif |
| return 0; |
| } |