blob: 43071672e457770f30d34eaf7ac844b56b44b09d [file] [log] [blame]
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -08001// FIXME: This test currently fails on Windows because we use the MSVC linker,
2// which throws away DWARF debug info.
3// XFAIL: win32
4//
Stephen Hines6d186232014-11-26 17:56:19 -08005// RUN: %clangxx -fsanitize=alignment -g %s -O3 -o %t
6// RUN: %run %t l0 && %run %t s0 && %run %t r0 && %run %t m0 && %run %t f0 && %run %t n0 && %run %t u0
Stephen Hines2d1fdb22014-05-28 23:58:16 -07007// RUN: %run %t l1 2>&1 | FileCheck %s --check-prefix=CHECK-LOAD --strict-whitespace
8// RUN: %run %t s1 2>&1 | FileCheck %s --check-prefix=CHECK-STORE
9// RUN: %run %t r1 2>&1 | FileCheck %s --check-prefix=CHECK-REFERENCE
10// RUN: %run %t m1 2>&1 | FileCheck %s --check-prefix=CHECK-MEMBER
11// RUN: %run %t f1 2>&1 | FileCheck %s --check-prefix=CHECK-MEMFUN
12// RUN: %run %t n1 2>&1 | FileCheck %s --check-prefix=CHECK-NEW
Stephen Hines6d186232014-11-26 17:56:19 -080013// RUN: %run %t u1 2>&1 | FileCheck %s --check-prefix=CHECK-UPCAST
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -080014// RUN: %env_ubsan_opts=print_stacktrace=1 %run %t l1 2>&1 | FileCheck %s --check-prefix=CHECK-LOAD --check-prefix=CHECK-%os-STACK-LOAD
Stephen Hines6d186232014-11-26 17:56:19 -080015
Stephen Hines86277eb2015-03-23 12:06:32 -070016// RUN: %clangxx -fsanitize=alignment -fno-sanitize-recover=alignment %s -O3 -o %t
Stephen Hines6d186232014-11-26 17:56:19 -080017// RUN: not %run %t w1 2>&1 | FileCheck %s --check-prefix=CHECK-WILD
Stephen Hines2d1fdb22014-05-28 23:58:16 -070018
19#include <new>
20
21struct S {
22 S() {}
23 int f() { return 0; }
24 int k;
25};
26
Stephen Hines6d186232014-11-26 17:56:19 -080027struct T : S {
28 int t;
29};
30
Stephen Hines2d1fdb22014-05-28 23:58:16 -070031int main(int, char **argv) {
32 char c[] __attribute__((aligned(8))) = { 0, 0, 0, 0, 1, 2, 3, 4, 5 };
33
34 // Pointer value may be unspecified here, but behavior is not undefined.
35 int *p = (int*)&c[4 + argv[1][1] - '0'];
36 S *s = (S*)p;
Stephen Hines6d186232014-11-26 17:56:19 -080037 T *t = (T*)p;
38
39 void *wild = reinterpret_cast<void *>(0x123L);
Stephen Hines2d1fdb22014-05-28 23:58:16 -070040
41 (void)*p; // ok!
42
43 switch (argv[1][0]) {
44 case 'l':
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -080045 // CHECK-LOAD: misaligned.cpp:[[@LINE+4]]{{(:12)?}}: runtime error: load of misaligned address [[PTR:0x[0-9a-f]*]] for type 'int', which requires 4 byte alignment
Stephen Hines2d1fdb22014-05-28 23:58:16 -070046 // CHECK-LOAD-NEXT: [[PTR]]: note: pointer points here
47 // CHECK-LOAD-NEXT: {{^ 00 00 00 01 02 03 04 05}}
48 // CHECK-LOAD-NEXT: {{^ \^}}
49 return *p && 0;
Stephen Hines6d186232014-11-26 17:56:19 -080050 // Slow stack unwinding is disabled on Darwin for now, see
51 // https://code.google.com/p/address-sanitizer/issues/detail?id=137
Pirama Arumuga Nainarcdce50b2015-07-01 12:26:56 -070052 // CHECK-Linux-STACK-LOAD: #0 {{.*}}main{{.*}}misaligned.cpp
Stephen Hines6d186232014-11-26 17:56:19 -080053 // Check for the already checked line to avoid lit error reports.
54 // CHECK-Darwin-STACK-LOAD: {{ }}
Stephen Hines2d1fdb22014-05-28 23:58:16 -070055
56 case 's':
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -080057 // CHECK-STORE: misaligned.cpp:[[@LINE+4]]{{(:5)?}}: runtime error: store to misaligned address [[PTR:0x[0-9a-f]*]] for type 'int', which requires 4 byte alignment
Stephen Hines2d1fdb22014-05-28 23:58:16 -070058 // CHECK-STORE-NEXT: [[PTR]]: note: pointer points here
59 // CHECK-STORE-NEXT: {{^ 00 00 00 01 02 03 04 05}}
60 // CHECK-STORE-NEXT: {{^ \^}}
61 *p = 1;
62 break;
63
64 case 'r':
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -080065 // CHECK-REFERENCE: misaligned.cpp:[[@LINE+4]]{{(:(5|15))?}}: runtime error: reference binding to misaligned address [[PTR:0x[0-9a-f]*]] for type 'int', which requires 4 byte alignment
Stephen Hines2d1fdb22014-05-28 23:58:16 -070066 // CHECK-REFERENCE-NEXT: [[PTR]]: note: pointer points here
67 // CHECK-REFERENCE-NEXT: {{^ 00 00 00 01 02 03 04 05}}
68 // CHECK-REFERENCE-NEXT: {{^ \^}}
69 {int &r = *p;}
70 break;
71
72 case 'm':
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -080073 // CHECK-MEMBER: misaligned.cpp:[[@LINE+4]]{{(:15)?}}: runtime error: member access within misaligned address [[PTR:0x[0-9a-f]*]] for type 'S', which requires 4 byte alignment
Stephen Hines2d1fdb22014-05-28 23:58:16 -070074 // CHECK-MEMBER-NEXT: [[PTR]]: note: pointer points here
75 // CHECK-MEMBER-NEXT: {{^ 00 00 00 01 02 03 04 05}}
76 // CHECK-MEMBER-NEXT: {{^ \^}}
77 return s->k && 0;
78
79 case 'f':
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -080080 // CHECK-MEMFUN: misaligned.cpp:[[@LINE+4]]{{(:12)?}}: runtime error: member call on misaligned address [[PTR:0x[0-9a-f]*]] for type 'S', which requires 4 byte alignment
Stephen Hines2d1fdb22014-05-28 23:58:16 -070081 // CHECK-MEMFUN-NEXT: [[PTR]]: note: pointer points here
82 // CHECK-MEMFUN-NEXT: {{^ 00 00 00 01 02 03 04 05}}
83 // CHECK-MEMFUN-NEXT: {{^ \^}}
84 return s->f() && 0;
85
86 case 'n':
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -080087 // CHECK-NEW: misaligned.cpp:[[@LINE+4]]{{(:21)?}}: runtime error: constructor call on misaligned address [[PTR:0x[0-9a-f]*]] for type 'S', which requires 4 byte alignment
Stephen Hines2d1fdb22014-05-28 23:58:16 -070088 // CHECK-NEW-NEXT: [[PTR]]: note: pointer points here
89 // CHECK-NEW-NEXT: {{^ 00 00 00 01 02 03 04 05}}
90 // CHECK-NEW-NEXT: {{^ \^}}
91 return (new (s) S)->k && 0;
Stephen Hines6d186232014-11-26 17:56:19 -080092
93 case 'u': {
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -080094 // CHECK-UPCAST: misaligned.cpp:[[@LINE+4]]{{(:17)?}}: runtime error: upcast of misaligned address [[PTR:0x[0-9a-f]*]] for type 'T', which requires 4 byte alignment
Stephen Hines6d186232014-11-26 17:56:19 -080095 // CHECK-UPCAST-NEXT: [[PTR]]: note: pointer points here
96 // CHECK-UPCAST-NEXT: {{^ 00 00 00 01 02 03 04 05}}
97 // CHECK-UPCAST-NEXT: {{^ \^}}
98 S *s2 = (S*)t;
99 return s2->f();
100 }
101
102 case 'w':
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800103 // CHECK-WILD: misaligned.cpp:[[@LINE+3]]{{(:35)?}}: runtime error: member access within misaligned address 0x{{0+}}123 for type 'S', which requires 4 byte alignment
Stephen Hines86277eb2015-03-23 12:06:32 -0700104 // CHECK-WILD-NEXT: 0x{{0+}}123: note: pointer points here
Stephen Hines6d186232014-11-26 17:56:19 -0800105 // CHECK-WILD-NEXT: <memory cannot be printed>
106 return static_cast<S*>(wild)->k;
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700107 }
108}