catch-undef-behavior.cpp revision 0e2c34f92f00628d48968dfea096d36381f494cb
10e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -std=c++11 -fsanitize=signed-integer-overflow,integer-divide-by-zero,float-divide-by-zero,shift,unreachable,return,vla-bound,alignment,null,vptr,object-size,float-cast-overflow,bool,enum,array-bounds,function -fsanitize-recover=signed-integer-overflow,integer-divide-by-zero,float-divide-by-zero,shift,vla-bound,alignment,null,vptr,object-size,float-cast-overflow,bool,enum,array-bounds,function -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s 20e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -std=c++11 -fsanitize=vptr,address -fsanitize-recover=vptr,address -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK-ASAN 30e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -std=c++11 -fsanitize=vptr -fsanitize-recover=vptr -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=DOWNCAST-NULL 40e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -std=c++11 -fsanitize=function -emit-llvm %s -o - -triple x86_64-linux-gnux32 | FileCheck %s --check-prefix=CHECK-X32 50e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -std=c++11 -fsanitize=function -emit-llvm %s -o - -triple i386-linux-gnu | FileCheck %s --check-prefix=CHECK-X86 62c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 7073fec91b73f08ba86ad46573141be14c7a0d262Richard Smithstruct S { 8073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith double d; 9073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith int a, b; 10073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith virtual int f(); 11073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith}; 12073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith 13176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Check that type descriptor global is not modified by ASan. 14176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-ASAN: [[TYPE_DESCR:@[0-9]+]] = private unnamed_addr constant { i16, i16, [4 x i8] } { i16 -1, i16 0, [4 x i8] c"'S'\00" } 15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Check that type mismatch handler is not modified by ASan. 17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-ASAN: private unnamed_addr global { { [{{.*}} x i8]*, i32, i32 }, { i16, i16, [4 x i8] }*, i8*, i8 } { {{.*}}, { i16, i16, [4 x i8] }* [[TYPE_DESCR]], {{.*}} } 18176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 19c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smithstruct T : S {}; 20c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 21176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z17reference_binding 22073fec91b73f08ba86ad46573141be14c7a0d262Richard Smithvoid reference_binding(int *p, S *q) { 232c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // C++ core issue 453: If an lvalue to which a reference is directly bound 242c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // designates neither an existing object or function of an appropriate type, 252c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // nor a region of storage of suitable size and alignment to contain an object 262c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // of the reference's type, the behavior is undefined. 272c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 282c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: icmp ne {{.*}}, null 292c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 302c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64 312c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp uge i64 %[[SIZE]], 4 322c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 332c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[PTRINT:.*]] = ptrtoint 342c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: %[[MISALIGN:.*]] = and i64 %[[PTRINT]], 3 352c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp eq i64 %[[MISALIGN]], 0 362c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith int &r = *p; 372c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 38073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith // A reference is not required to refer to an object within its lifetime. 39073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith // CHECK-NOT: __ubsan_handle_dynamic_type_cache_miss 40073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith S &r2 = *q; 41073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith} 422c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 43176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z13member_access 44176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-ASAN-LABEL: @_Z13member_access 452c9f87ca5cccbfdaad82762368af5b2323320653Richard Smithvoid member_access(S *p) { 460848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // (1a) Check 'p' is appropriately sized and aligned for member access. 472c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 482c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: icmp ne {{.*}}, null 492c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 502c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64 512c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp uge i64 %[[SIZE]], 24 522c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 532c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[PTRINT:.*]] = ptrtoint 542c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: %[[MISALIGN:.*]] = and i64 %[[PTRINT]], 7 552c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp eq i64 %[[MISALIGN]], 0 562c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 570848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // (1b) Check that 'p' actually points to an 'S'. 580848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 590848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK: %[[VPTRADDR:.*]] = bitcast {{.*}} to i64* 600848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: %[[VPTR:.*]] = load i64* %[[VPTRADDR]] 610848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // 620848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // hash_16_bytes: 630848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // 640848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // If this number changes, it indicates that either the mangled name of ::S 650848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // has changed, or that LLVM's hashing function has changed. The latter case 660848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // is OK if the hashing function is still stable. 67ca53087029204abc02c95fa3cf953ed60b19a3cdRichard Smith // 68ca53087029204abc02c95fa3cf953ed60b19a3cdRichard Smith // The two hash values are for 64- and 32-bit Clang binaries, respectively. 69ca53087029204abc02c95fa3cf953ed60b19a3cdRichard Smith // FIXME: We should produce a 64-bit value either way. 70ca53087029204abc02c95fa3cf953ed60b19a3cdRichard Smith // 71ca53087029204abc02c95fa3cf953ed60b19a3cdRichard Smith // CHECK-NEXT: xor i64 {{-4030275160588942838|2562089159}}, %[[VPTR]] 720848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: mul i64 {{.*}}, -7070675565921424023 730848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: lshr i64 {{.*}}, 47 740848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: xor i64 750848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: xor i64 %[[VPTR]] 760848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: mul i64 {{.*}}, -7070675565921424023 770848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: lshr i64 {{.*}}, 47 780848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: xor i64 790848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: %[[HASH:.*]] = mul i64 {{.*}}, -7070675565921424023 800848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // 810848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // Check the hash against the table: 820848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // 830848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: %[[IDX:.*]] = and i64 %{{.*}}, 127 840848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: getelementptr inbounds [128 x i64]* @__ubsan_vptr_type_cache, i32 0, i64 %[[IDX]] 850848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: %[[CACHEVAL:.*]] = load i64* 860848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: icmp eq i64 %[[CACHEVAL]], %[[HASH]] 870848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: br i1 880848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 892d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss({{.*}}, i64 %{{.*}}, i64 %[[HASH]]) 90ad95481b2769ad61f23afc5e2c31f11c66090657Will Dietz // CHECK-NOT: unreachable 91ad95481b2769ad61f23afc5e2c31f11c66090657Will Dietz // CHECK: {{.*}}: 920848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 932c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // (2) Check 'p->b' is appropriately sized and aligned for a load. 942c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 952c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // FIXME: Suppress this in the trivial case of a member access, because we 962c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // know we've just checked the member access expression itself. 972c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 982c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64 992c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp uge i64 %[[SIZE]], 4 1002c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 1012c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[PTRINT:.*]] = ptrtoint 1022c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: %[[MISALIGN:.*]] = and i64 %[[PTRINT]], 3 1032c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp eq i64 %[[MISALIGN]], 0 1042c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith int k = p->b; 1052c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 1060848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // (3a) Check 'p' is appropriately sized and aligned for member function call. 1072c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 1082c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: icmp ne {{.*}}, null 1092c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 1102c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64 1112c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp uge i64 %[[SIZE]], 24 1122c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 1132c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[PTRINT:.*]] = ptrtoint 1142c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: %[[MISALIGN:.*]] = and i64 %[[PTRINT]], 7 1152c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp eq i64 %[[MISALIGN]], 0 1160848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 1170848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // (3b) Check that 'p' actually points to an 'S' 1180848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 1190848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK: load i64* 120d6f833091fbacc73980b9c4018363455b6aa82a7Richard Smith // CHECK-NEXT: xor i64 {{-4030275160588942838|2562089159}}, 1210848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // [...] 1220848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK: getelementptr inbounds [128 x i64]* @__ubsan_vptr_type_cache, i32 0, i64 % 1230848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK: br i1 1242d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss({{.*}}, i64 %{{.*}}, i64 %{{.*}}) 125ad95481b2769ad61f23afc5e2c31f11c66090657Will Dietz // CHECK-NOT: unreachable 126ad95481b2769ad61f23afc5e2c31f11c66090657Will Dietz // CHECK: {{.*}}: 1270848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 1282c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith k = p->f(); 1292c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith} 1309d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith 131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z12lsh_overflow 1329d3e226acad5e23e562cde0a69362bb266f2a333Richard Smithint lsh_overflow(int a, int b) { 1339d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK: %[[INBOUNDS:.*]] = icmp ule i32 %[[RHS:.*]], 31 1349d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK-NEXT: br i1 %[[INBOUNDS]] 1359d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith 1369d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK: %[[SHIFTED_OUT_WIDTH:.*]] = sub nuw nsw i32 31, %[[RHS]] 1379d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK-NEXT: %[[SHIFTED_OUT:.*]] = lshr i32 %[[LHS:.*]], %[[SHIFTED_OUT_WIDTH]] 1389d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith 1399d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // This is present for C++11 but not for C: C++ core issue 1457 allows a '1' 1409d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // to be shifted into the sign bit, but not out of it. 1419d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK-NEXT: %[[SHIFTED_OUT_NOT_SIGN:.*]] = lshr i32 %[[SHIFTED_OUT]], 1 1429d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith 1439d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK-NEXT: %[[NO_OVERFLOW:.*]] = icmp eq i32 %[[SHIFTED_OUT_NOT_SIGN]], 0 144bb60fc6a71f280f8e19e7f1a784ef05c40f5aa39Will Dietz 145bb60fc6a71f280f8e19e7f1a784ef05c40f5aa39Will Dietz // CHECK: %[[VALID:.*]] = phi i1 [ %[[INBOUNDS]], {{.*}} ], [ %[[NO_OVERFLOW]], {{.*}} ] 146bb60fc6a71f280f8e19e7f1a784ef05c40f5aa39Will Dietz // CHECK-NEXT: br i1 %[[VALID]] 147bb60fc6a71f280f8e19e7f1a784ef05c40f5aa39Will Dietz 148bb60fc6a71f280f8e19e7f1a784ef05c40f5aa39Will Dietz // CHECK: call void @__ubsan_handle_shift_out_of_bounds 149bb60fc6a71f280f8e19e7f1a784ef05c40f5aa39Will Dietz // CHECK-NOT: call void @__ubsan_handle_shift_out_of_bounds 1509d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith 1519d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK: %[[RET:.*]] = shl i32 %[[LHS]], %[[RHS]] 1529d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK-NEXT: ret i32 %[[RET]] 1539d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith return a << b; 1549d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith} 15536ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith 156176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z9no_return 15736ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smithint no_return() { 1584e1125f630e75a52209b928e9d43b638abf39987Bill Wendling // CHECK: call void @__ubsan_handle_missing_return(i8* bitcast ({{.*}}* @{{.*}} to i8*)) [[NR_NUW:#[0-9]+]] 1594def70d3040e73707c738f7c366737a986135edfRichard Smith // CHECK-NEXT: unreachable 16036ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith} 161463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith 162176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z9sour_bool 163463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smithbool sour_bool(bool *p) { 164463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[OK:.*]] = icmp ule i8 {{.*}}, 1 165463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: br i1 %[[OK]] 1662d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_load_invalid_value(i8* bitcast ({{.*}}), i64 {{.*}}) 167463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith return *p; 168463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith} 169463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith 170463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smithenum E1 { e1a = 0, e1b = 127 } e1; 171463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smithenum E2 { e2a = -1, e2b = 64 } e2; 172463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smithenum E3 { e3a = (1u << 31) - 1 } e3; 173463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith 174176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z14bad_enum_value 175463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smithint bad_enum_value() { 176463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[E1:.*]] = icmp ule i32 {{.*}}, 127 177463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: br i1 %[[E1]] 1782d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_load_invalid_value( 179463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith int a = e1; 180463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith 181463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[E2HI:.*]] = icmp sle i32 {{.*}}, 127 182463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[E2LO:.*]] = icmp sge i32 {{.*}}, -128 183463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[E2:.*]] = and i1 %[[E2HI]], %[[E2LO]] 184463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: br i1 %[[E2]] 1852d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_load_invalid_value( 186463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith int b = e2; 187463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith 188463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[E3:.*]] = icmp ule i32 {{.*}}, 2147483647 189463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: br i1 %[[E3]] 1902d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_load_invalid_value( 191463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith int c = e3; 192463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith return a + b + c; 193463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith} 194c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 195176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z20bad_downcast_pointer 196176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// DOWNCAST-NULL-LABEL: @_Z20bad_downcast_pointer 197c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smithvoid bad_downcast_pointer(S *p) { 198c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[NONNULL:.*]] = icmp ne {{.*}}, null 199c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br i1 %[[NONNULL]], 200c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 201176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // A null poiner access is guarded without -fsanitize=null. 202176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // DOWNCAST-NULL: %[[NONNULL:.*]] = icmp ne {{.*}}, null 203176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // DOWNCAST-NULL: br i1 %[[NONNULL]], 204176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2058dd4baacf584b1fc7b0e2c79a0b8b197a4fb5fabMatt Arsenault // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64.p0i8( 206c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E1:.*]] = icmp uge i64 %[[SIZE]], 24 207c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[MISALIGN:.*]] = and i64 %{{.*}}, 7 208c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E2:.*]] = icmp eq i64 %[[MISALIGN]], 0 209c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E12:.*]] = and i1 %[[E1]], %[[E2]] 210c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br i1 %[[E12]], 211c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 212c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: call void @__ubsan_handle_type_mismatch 213c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br label 214c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 215c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br i1 %{{.*}}, 216c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 217c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss 218c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br label 219c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith (void) static_cast<T*>(p); 220c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith} 221c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 222176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z22bad_downcast_reference 223c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smithvoid bad_downcast_reference(S &p) { 224c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E1:.*]] = icmp ne {{.*}}, null 225c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK-NOT: br i1 226176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2278dd4baacf584b1fc7b0e2c79a0b8b197a4fb5fabMatt Arsenault // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64.p0i8( 228c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E2:.*]] = icmp uge i64 %[[SIZE]], 24 229176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 230c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[MISALIGN:.*]] = and i64 %{{.*}}, 7 231c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E3:.*]] = icmp eq i64 %[[MISALIGN]], 0 232176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 233176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: %[[E12:.*]] = and i1 %[[E1]], %[[E2]] 234c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E123:.*]] = and i1 %[[E12]], %[[E3]] 235c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br i1 %[[E123]], 236c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 237c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: call void @__ubsan_handle_type_mismatch 238c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br label 239c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 240c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br i1 %{{.*}}, 241c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 242c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss 243c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br label 244c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith (void) static_cast<T&>(p); 245c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith} 2464e1125f630e75a52209b928e9d43b638abf39987Bill Wendling 247176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z11array_index 248a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint array_index(const int (&a)[4], int n) { 249a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[K1_OK:.*]] = icmp ult i64 %{{.*}}, 4 250a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[K1_OK]] 251a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 252a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int k1 = a[n]; 253a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 254a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[R1_OK:.*]] = icmp ule i64 %{{.*}}, 4 255a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[R1_OK]] 256a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 257a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith const int *r1 = &a[n]; 258a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 259a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[K2_OK:.*]] = icmp ult i64 %{{.*}}, 8 260a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[K2_OK]] 261a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 262a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int k2 = ((const int(&)[8])a)[n]; 263a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 264a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[K3_OK:.*]] = icmp ult i64 %{{.*}}, 4 265a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[K3_OK]] 266a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 267a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int k3 = n[a]; 268a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 269a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return k1 + *r1 + k2; 270a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 271a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 272176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z17multi_array_index 273a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint multi_array_index(int n, int m) { 274a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int arr[4][6]; 275a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 276a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[IDX2_OK:.*]] = icmp ult i64 %{{.*}}, 6 277a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[IDX2_OK]] 278a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 279a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 280a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[IDX1_OK:.*]] = icmp ult i64 %{{.*}}, 4 281a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[IDX1_OK]] 282a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 283a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return arr[n][m]; 284a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 285a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 286176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z11array_arith 287a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint array_arith(const int (&a)[4], int n) { 288a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[K1_OK:.*]] = icmp ule i64 %{{.*}}, 4 289a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[K1_OK]] 290a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 291a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith const int *k1 = a + n; 292a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 293a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[K2_OK:.*]] = icmp ule i64 %{{.*}}, 8 294a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[K2_OK]] 295a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 296a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith const int *k2 = (const int(&)[8])a + n; 297a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 298a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return *k1 + *k2; 299a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 300a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 301a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithstruct ArrayMembers { 302a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int a1[5]; 303a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int a2[1]; 304a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith}; 305176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z18struct_array_index 306a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint struct_array_index(ArrayMembers *p, int n) { 307a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[IDX_OK:.*]] = icmp ult i64 %{{.*}}, 5 308a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[IDX_OK]] 309a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 310a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return p->a1[n]; 311a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 312a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 313176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z16flex_array_index 314a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint flex_array_index(ArrayMembers *p, int n) { 315a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK-NOT: call void @__ubsan_handle_out_of_bounds( 316a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return p->a2[n]; 317a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 318a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 3195956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smithextern int incomplete[]; 320176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z22incomplete_array_index 3215956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smithint incomplete_array_index(int n) { 3225956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smith // CHECK-NOT: call void @__ubsan_handle_out_of_bounds( 3235956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smith return incomplete[n]; 3245956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smith} 3255956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smith 326a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithtypedef __attribute__((ext_vector_type(4))) int V4I; 327176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z12vector_index 328a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint vector_index(V4I v, int n) { 329a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[IDX_OK:.*]] = icmp ult i64 %{{.*}}, 4 330a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[IDX_OK]] 331a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 332a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return v[n]; 333a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 334a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 335176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z12string_index 336a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithchar string_index(int n) { 337a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[IDX_OK:.*]] = icmp ult i64 %{{.*}}, 6 338a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[IDX_OK]] 339a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 340a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return "Hello"[n]; 341a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 342a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 3438593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhasclass A // align=4 3448593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas{ 3458593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas int a1, a2, a3; 3468593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas}; 3478593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas 3488593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhasclass B // align=8 3498593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas{ 3508593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas long b1, b2; 3518593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas}; 3528593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas 3538593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhasclass C : public A, public B // align=16 3548593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas{ 3558593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas alignas(16) int c1; 3568593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas}; 3578593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas 3588593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas// Make sure we check the alignment of the pointer after subtracting any 3598593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas// offset. The pointer before subtraction doesn't need to be aligned for 3608593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas// the destination type. 3618593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas 36262a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky// CHECK-LABEL: define void @_Z16downcast_pointerP1B(%class.B* %b) 3638593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhasvoid downcast_pointer(B *b) { 3648593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas (void) static_cast<C*>(b); 3658593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // Alignment check from EmitTypeCheck(TCK_DowncastPointer, ...) 366ce744175b827f855c381eb0bdcdceceda86c87cdFilipe Cabecinhas // CHECK: [[SUB:%[.a-z0-9]*]] = getelementptr i8* {{.*}}, i64 -16 3678593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK-NEXT: [[C:%[0-9]*]] = bitcast i8* [[SUB]] to %class.C* 3688593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // null check goes here 3699793fe99de5ab92162cb70a7d2584c1de0952d73Filipe Cabecinhas // CHECK: [[FROM_PHI:%[0-9]*]] = phi %class.C* [ [[C]], {{.*}} ], {{.*}} 3708593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // Objectsize check goes here 3718593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK: [[C_INT:%[0-9]*]] = ptrtoint %class.C* [[FROM_PHI]] to i64 3728593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK-NEXT: [[MASKED:%[0-9]*]] = and i64 [[C_INT]], 15 3738593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK-NEXT: [[TEST:%[0-9]*]] = icmp eq i64 [[MASKED]], 0 3748593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // AND the alignment test with the objectsize test. 3758593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK-NEXT: [[AND:%[0-9]*]] = and i1 {{.*}}, [[TEST]] 3769793fe99de5ab92162cb70a7d2584c1de0952d73Filipe Cabecinhas // CHECK-NEXT: br i1 [[AND]] 3778593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas} 3788593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas 379176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: define void @_Z18downcast_referenceR1B(%class.B* dereferenceable({{[0-9]+}}) %b) 3808593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhasvoid downcast_reference(B &b) { 3818593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas (void) static_cast<C&>(b); 3828593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // Alignment check from EmitTypeCheck(TCK_DowncastReference, ...) 383ce744175b827f855c381eb0bdcdceceda86c87cdFilipe Cabecinhas // CHECK: [[SUB:%[.a-z0-9]*]] = getelementptr i8* {{.*}}, i64 -16 3848593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK-NEXT: [[C:%[0-9]*]] = bitcast i8* [[SUB]] to %class.C* 3858593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // Objectsize check goes here 3868593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK: [[C_INT:%[0-9]*]] = ptrtoint %class.C* [[C]] to i64 3878593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK-NEXT: [[MASKED:%[0-9]*]] = and i64 [[C_INT]], 15 3888593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK-NEXT: [[TEST:%[0-9]*]] = icmp eq i64 [[MASKED]], 0 3898593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // AND the alignment test with the objectsize test. 390176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: [[AND:%[0-9]*]] = and i1 {{.*}}, [[TEST]] 3919793fe99de5ab92162cb70a7d2584c1de0952d73Filipe Cabecinhas // CHECK-NEXT: br i1 [[AND]] 3928593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas} 3938593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas 3940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-LABEL: @_Z22indirect_function_callPFviE({{.*}} prologue <{ i32, i8* }> <{ i32 1413876459, i8* bitcast ({ i8*, i8* }* @_ZTIFvPFviEE to i8*) }> 3950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-X32: @_Z22indirect_function_callPFviE({{.*}} prologue <{ i32, i8* }> <{ i32 1413875435, i8* bitcast ({ i8*, i8* }* @_ZTIFvPFviEE to i8*) }> 3960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-X86: @_Z22indirect_function_callPFviE({{.*}} prologue <{ i32, i8* }> <{ i32 1413875435, i8* bitcast ({ i8*, i8* }* @_ZTIFvPFviEE to i8*) }> 397b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbournevoid indirect_function_call(void (*p)(int)) { 398b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // CHECK: [[PTR:%[0-9]*]] = bitcast void (i32)* {{.*}} to <{ i32, i8* }>* 399b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne 400b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // Signature check 401b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // CHECK-NEXT: [[SIGPTR:%[0-9]*]] = getelementptr <{ i32, i8* }>* [[PTR]], i32 0, i32 0 402b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // CHECK-NEXT: [[SIG:%[0-9]*]] = load i32* [[SIGPTR]] 403b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // CHECK-NEXT: [[SIGCMP:%[0-9]*]] = icmp eq i32 [[SIG]], 1413876459 404b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // CHECK-NEXT: br i1 [[SIGCMP]] 405b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne 406b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // RTTI pointer check 407b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // CHECK: [[RTTIPTR:%[0-9]*]] = getelementptr <{ i32, i8* }>* [[PTR]], i32 0, i32 1 408b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // CHECK-NEXT: [[RTTI:%[0-9]*]] = load i8** [[RTTIPTR]] 409b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // CHECK-NEXT: [[RTTICMP:%[0-9]*]] = icmp eq i8* [[RTTI]], bitcast ({ i8*, i8* }* @_ZTIFviE to i8*) 410b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // CHECK-NEXT: br i1 [[RTTICMP]] 411b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne p(42); 412b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne} 413b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne 414176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace UpcastPointerTest { 415176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct S {}; 416176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct T : S { double d; }; 417176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct V : virtual S {}; 418176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 419176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: upcast_pointer 420176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesS* upcast_pointer(T* t) { 421176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Check for null pointer 422176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: %[[NONNULL:.*]] = icmp ne {{.*}}, null 423176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: br i1 %[[NONNULL]] 424176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 425176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Check alignment 426176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: %[[MISALIGN:.*]] = and i64 %{{.*}}, 7 427176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: icmp eq i64 %[[MISALIGN]], 0 428176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 429176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: call void @__ubsan_handle_type_mismatch 430176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return t; 431176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 432176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 433176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesV getV(); 434176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 435176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: upcast_to_vbase 436176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid upcast_to_vbase() { 437176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // No need to check for null here, as we have a temporary here. 438176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 439176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK-NOT: br i1 440176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 441176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: call i64 @llvm.objectsize 442176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: call void @__ubsan_handle_type_mismatch 443176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss 444176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const S& s = getV(); 445176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 446176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 447176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 44862a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewyckynamespace CopyValueRepresentation { 44962a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky // CHECK-LABEL: define {{.*}} @_ZN23CopyValueRepresentation2S3aSERKS0_ 45062a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky // CHECK-NOT: call {{.*}} @__ubsan_handle_load_invalid_value 45162a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky // CHECK-LABEL: define {{.*}} @_ZN23CopyValueRepresentation2S4aSEOS0_ 45262a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky // CHECK-NOT: call {{.*}} @__ubsan_handle_load_invalid_value 4530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // CHECK-LABEL: define {{.*}} @_ZN23CopyValueRepresentation2S1C2ERKS0_ 45462a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky // CHECK-NOT: call {{.*}} __ubsan_handle_load_invalid_value 45562a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky // CHECK-LABEL: define {{.*}} @_ZN23CopyValueRepresentation2S2C2ERKS0_ 45662a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky // CHECK: __ubsan_handle_load_invalid_value 4570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // CHECK-LABEL: define {{.*}} @_ZN23CopyValueRepresentation2S5C2ERKS0_ 45862a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky // CHECK-NOT: call {{.*}} __ubsan_handle_load_invalid_value 45962a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky 46062a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct CustomCopy { CustomCopy(); CustomCopy(const CustomCopy&); }; 46162a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct S1 { 46262a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky CustomCopy CC; 46362a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky bool b; 46462a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky }; 46562a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky void callee1(S1); 46662a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky void test1() { 46762a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky S1 s11; 46862a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky callee1(s11); 46962a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky S1 s12; 47062a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky s12 = s11; 47162a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky } 47262a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky 47362a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky static bool some_global_bool; 47462a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct ExprCopy { 47562a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky ExprCopy(); 47662a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky ExprCopy(const ExprCopy&, bool b = some_global_bool); 47762a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky }; 47862a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct S2 { 47962a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky ExprCopy EC; 48062a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky bool b; 48162a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky }; 48262a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky void callee2(S2); 48362a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky void test2(void) { 48462a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky S2 s21; 48562a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky callee2(s21); 48662a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky S2 s22; 48762a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky s22 = s21; 48862a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky } 48962a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky 49062a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct CustomAssign { CustomAssign &operator=(const CustomAssign&); }; 49162a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct S3 { 49262a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky CustomAssign CA; 49362a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky bool b; 49462a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky }; 49562a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky void test3() { 49662a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky S3 x, y; 49762a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky x = y; 49862a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky } 49962a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky 50062a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct CustomMove { 50162a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky CustomMove(); 50262a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky CustomMove(const CustomMove&&); 50362a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky CustomMove &operator=(const CustomMove&&); 50462a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky }; 50562a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct S4 { 50662a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky CustomMove CM; 50762a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky bool b; 50862a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky }; 50962a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky void test4() { 51062a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky S4 x, y; 51162a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky x = static_cast<S4&&>(y); 51262a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky } 51362a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky 51462a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct EnumCustomCopy { 51562a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky EnumCustomCopy(); 51662a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky EnumCustomCopy(const EnumCustomCopy&); 51762a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky }; 51862a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct S5 { 51962a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky EnumCustomCopy ECC; 52062a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky bool b; 52162a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky }; 52262a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky void callee5(S5); 52362a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky void test5() { 52462a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky S5 s51; 52562a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky callee5(s51); 52662a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky S5 s52; 52762a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky s52 = s51; 52862a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky } 52962a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky} 53062a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky 5314e1125f630e75a52209b928e9d43b638abf39987Bill Wendling// CHECK: attributes [[NR_NUW]] = { noreturn nounwind } 532