1*673dc3d4SNico Weber // RUN: %clangxx_asan -O0 -std=c++11 %s -o %t && %run %t 2>&1 | FileCheck %s
2*673dc3d4SNico Weber // RUN: %clangxx_asan -O1 -std=c++11 %s -o %t && %run %t 2>&1 | FileCheck %s
3*673dc3d4SNico Weber // RUN: %clangxx_asan -O2 -std=c++11 %s -o %t && %run %t 2>&1 | FileCheck %s
4*673dc3d4SNico Weber
5*673dc3d4SNico Weber // Test that we do not detect false buffer overflows cased by optimization when
6*673dc3d4SNico Weber // when local variable replaced by a smaller global constant.
7*673dc3d4SNico Weber // https://bugs.llvm.org/show_bug.cgi?id=33372
8*673dc3d4SNico Weber
9*673dc3d4SNico Weber #include <stdio.h>
10*673dc3d4SNico Weber #include <string.h>
11*673dc3d4SNico Weber
12*673dc3d4SNico Weber struct A { int x, y, z; };
13*673dc3d4SNico Weber struct B { A a; /*gap*/ long b; };
14*673dc3d4SNico Weber B *bb;
15*673dc3d4SNico Weber
test1()16*673dc3d4SNico Weber void test1() {
17*673dc3d4SNico Weber A a1 = {1, 1, 2};
18*673dc3d4SNico Weber B b1 = {a1, 6};
19*673dc3d4SNico Weber bb = new B(b1);
20*673dc3d4SNico Weber }
21*673dc3d4SNico Weber
22*673dc3d4SNico Weber const char KKK[] = {1, 1, 2};
23*673dc3d4SNico Weber char bbb[100000];
24*673dc3d4SNico Weber
test2()25*673dc3d4SNico Weber void test2() {
26*673dc3d4SNico Weber char cc[sizeof(bbb)];
27*673dc3d4SNico Weber memcpy(cc, KKK , sizeof(KKK));
28*673dc3d4SNico Weber memcpy(bbb, cc, sizeof(bbb));
29*673dc3d4SNico Weber }
30*673dc3d4SNico Weber
main(int argc,char * argv[])31*673dc3d4SNico Weber int main(int argc, char *argv[]) {
32*673dc3d4SNico Weber test1();
33*673dc3d4SNico Weber test2();
34*673dc3d4SNico Weber printf("PASSED");
35*673dc3d4SNico Weber return 0;
36*673dc3d4SNico Weber }
37*673dc3d4SNico Weber
38*673dc3d4SNico Weber // CHECK-NOT: ERROR: AddressSanitizer
39*673dc3d4SNico Weber // CHECK: PASSED
40