1 // Verify that objects passed by value get red zones and that the copy
2 // constructor is called.
3 // RUN: %clangxx_asan -O0 %s -o %t
4 // RUN: not %run %t 2>&1 | FileCheck %s --implicit-check-not \
5 // RUN:     Assertion{{.*}}failed
6 
7 // ASan instrumentation can't insert red-zones around inalloca parameters.
8 // XFAIL: windows-msvc && asan-32-bits
9 
10 #include <cassert>
11 
12 class A {
13  public:
A()14   A() : me(this) {}
A(const A & other)15   A(const A &other) : me(this) {
16     for (int i = 0; i < 8; ++i) a[i] = other.a[i];
17   }
18 
19   int a[8];
20   A *me;
21 };
22 
bar(A * a)23 int bar(A *a) {
24   int *volatile ptr = &a->a[0];
25   return *(ptr - 1);
26 }
27 
foo(A a)28 void foo(A a) {
29   assert(a.me == &a);
30   bar(&a);
31 }
32 
main()33 int main() {
34   A a;
35   foo(a);
36 }
37 
38 // CHECK: ERROR: AddressSanitizer: stack-buffer-overflow
39 // CHECK: READ of size 4 at
40 // CHECK: is located in stack of thread
41