catch-undef-behavior.cpp revision 5956bcc31ad0b1f570e04f7e19e817112f7274c5
1a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith// RUN: %clang_cc1 -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,bounds -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s 22c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 3073fec91b73f08ba86ad46573141be14c7a0d262Richard Smithstruct S { 4073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith double d; 5073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith int a, b; 6073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith virtual int f(); 7073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith}; 8073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith 9c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smithstruct T : S {}; 10c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 112c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith// CHECK: @_Z17reference_binding 12073fec91b73f08ba86ad46573141be14c7a0d262Richard Smithvoid reference_binding(int *p, S *q) { 132c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // C++ core issue 453: If an lvalue to which a reference is directly bound 142c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // designates neither an existing object or function of an appropriate type, 152c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // nor a region of storage of suitable size and alignment to contain an object 162c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // of the reference's type, the behavior is undefined. 172c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 182c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: icmp ne {{.*}}, null 192c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 202c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64 212c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp uge i64 %[[SIZE]], 4 222c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 232c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[PTRINT:.*]] = ptrtoint 242c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: %[[MISALIGN:.*]] = and i64 %[[PTRINT]], 3 252c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp eq i64 %[[MISALIGN]], 0 262c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith int &r = *p; 272c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 28073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith // A reference is not required to refer to an object within its lifetime. 29073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith // CHECK-NOT: __ubsan_handle_dynamic_type_cache_miss 30073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith S &r2 = *q; 31073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith} 322c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 332c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith// CHECK: @_Z13member_access 342c9f87ca5cccbfdaad82762368af5b2323320653Richard Smithvoid member_access(S *p) { 350848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // (1a) Check 'p' is appropriately sized and aligned for member access. 362c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 372c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: icmp ne {{.*}}, null 382c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 392c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64 402c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp uge i64 %[[SIZE]], 24 412c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 422c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[PTRINT:.*]] = ptrtoint 432c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: %[[MISALIGN:.*]] = and i64 %[[PTRINT]], 7 442c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp eq i64 %[[MISALIGN]], 0 452c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 460848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // (1b) Check that 'p' actually points to an 'S'. 470848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 480848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK: %[[VPTRADDR:.*]] = bitcast {{.*}} to i64* 490848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: %[[VPTR:.*]] = load i64* %[[VPTRADDR]] 500848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // 510848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // hash_16_bytes: 520848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // 530848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // If this number changes, it indicates that either the mangled name of ::S 540848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // has changed, or that LLVM's hashing function has changed. The latter case 550848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // is OK if the hashing function is still stable. 56ca53087029204abc02c95fa3cf953ed60b19a3cdRichard Smith // 57ca53087029204abc02c95fa3cf953ed60b19a3cdRichard Smith // The two hash values are for 64- and 32-bit Clang binaries, respectively. 58ca53087029204abc02c95fa3cf953ed60b19a3cdRichard Smith // FIXME: We should produce a 64-bit value either way. 59ca53087029204abc02c95fa3cf953ed60b19a3cdRichard Smith // 60ca53087029204abc02c95fa3cf953ed60b19a3cdRichard Smith // CHECK-NEXT: xor i64 {{-4030275160588942838|2562089159}}, %[[VPTR]] 610848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: mul i64 {{.*}}, -7070675565921424023 620848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: lshr i64 {{.*}}, 47 630848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: xor i64 640848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: xor i64 %[[VPTR]] 650848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: mul i64 {{.*}}, -7070675565921424023 660848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: lshr i64 {{.*}}, 47 670848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: xor i64 680848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: %[[HASH:.*]] = mul i64 {{.*}}, -7070675565921424023 690848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // 700848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // Check the hash against the table: 710848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // 720848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: %[[IDX:.*]] = and i64 %{{.*}}, 127 730848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: getelementptr inbounds [128 x i64]* @__ubsan_vptr_type_cache, i32 0, i64 %[[IDX]] 740848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: %[[CACHEVAL:.*]] = load i64* 750848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: icmp eq i64 %[[CACHEVAL]], %[[HASH]] 760848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: br i1 770848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 782d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss({{.*}}, i64 %{{.*}}, i64 %[[HASH]]) 79ad95481b2769ad61f23afc5e2c31f11c66090657Will Dietz // CHECK-NOT: unreachable 80ad95481b2769ad61f23afc5e2c31f11c66090657Will Dietz // CHECK: {{.*}}: 810848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 822c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // (2) Check 'p->b' is appropriately sized and aligned for a load. 832c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 842c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // FIXME: Suppress this in the trivial case of a member access, because we 852c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // know we've just checked the member access expression itself. 862c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 872c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64 882c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp uge i64 %[[SIZE]], 4 892c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 902c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[PTRINT:.*]] = ptrtoint 912c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: %[[MISALIGN:.*]] = and i64 %[[PTRINT]], 3 922c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp eq i64 %[[MISALIGN]], 0 932c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith int k = p->b; 942c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 950848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // (3a) Check 'p' is appropriately sized and aligned for member function call. 962c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 972c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: icmp ne {{.*}}, null 982c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 992c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64 1002c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp uge i64 %[[SIZE]], 24 1012c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 1022c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[PTRINT:.*]] = ptrtoint 1032c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: %[[MISALIGN:.*]] = and i64 %[[PTRINT]], 7 1042c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp eq i64 %[[MISALIGN]], 0 1050848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 1060848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // (3b) Check that 'p' actually points to an 'S' 1070848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 1080848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK: load i64* 109d6f833091fbacc73980b9c4018363455b6aa82a7Richard Smith // CHECK-NEXT: xor i64 {{-4030275160588942838|2562089159}}, 1100848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // [...] 1110848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK: getelementptr inbounds [128 x i64]* @__ubsan_vptr_type_cache, i32 0, i64 % 1120848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK: br i1 1132d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss({{.*}}, i64 %{{.*}}, i64 %{{.*}}) 114ad95481b2769ad61f23afc5e2c31f11c66090657Will Dietz // CHECK-NOT: unreachable 115ad95481b2769ad61f23afc5e2c31f11c66090657Will Dietz // CHECK: {{.*}}: 1160848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 1172c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith k = p->f(); 1182c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith} 1199d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith 1209d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith// CHECK: @_Z12lsh_overflow 1219d3e226acad5e23e562cde0a69362bb266f2a333Richard Smithint lsh_overflow(int a, int b) { 1229d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK: %[[INBOUNDS:.*]] = icmp ule i32 %[[RHS:.*]], 31 1239d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK-NEXT: br i1 %[[INBOUNDS]] 1249d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith 1259d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK: %[[SHIFTED_OUT_WIDTH:.*]] = sub nuw nsw i32 31, %[[RHS]] 1269d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK-NEXT: %[[SHIFTED_OUT:.*]] = lshr i32 %[[LHS:.*]], %[[SHIFTED_OUT_WIDTH]] 1279d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith 1289d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // This is present for C++11 but not for C: C++ core issue 1457 allows a '1' 1299d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // to be shifted into the sign bit, but not out of it. 1309d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK-NEXT: %[[SHIFTED_OUT_NOT_SIGN:.*]] = lshr i32 %[[SHIFTED_OUT]], 1 1319d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith 1329d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK-NEXT: %[[NO_OVERFLOW:.*]] = icmp eq i32 %[[SHIFTED_OUT_NOT_SIGN]], 0 1339d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK-NEXT: br i1 %[[NO_OVERFLOW]] 1349d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith 1359d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK: %[[RET:.*]] = shl i32 %[[LHS]], %[[RHS]] 1369d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK-NEXT: ret i32 %[[RET]] 1379d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith return a << b; 1389d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith} 13936ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith 14036ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith// CHECK: @_Z9no_return 14136ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smithint no_return() { 1424e1125f630e75a52209b928e9d43b638abf39987Bill Wendling // CHECK: call void @__ubsan_handle_missing_return(i8* bitcast ({{.*}}* @{{.*}} to i8*)) [[NR_NUW:#[0-9]+]] 1434def70d3040e73707c738f7c366737a986135edfRichard Smith // CHECK-NEXT: unreachable 14436ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith} 145463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith 146463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith// CHECK: @_Z9sour_bool 147463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smithbool sour_bool(bool *p) { 148463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[OK:.*]] = icmp ule i8 {{.*}}, 1 149463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: br i1 %[[OK]] 1502d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_load_invalid_value(i8* bitcast ({{.*}}), i64 {{.*}}) 151463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith return *p; 152463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith} 153463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith 154463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smithenum E1 { e1a = 0, e1b = 127 } e1; 155463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smithenum E2 { e2a = -1, e2b = 64 } e2; 156463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smithenum E3 { e3a = (1u << 31) - 1 } e3; 157463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith 158463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith// CHECK: @_Z14bad_enum_value 159463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smithint bad_enum_value() { 160463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[E1:.*]] = icmp ule i32 {{.*}}, 127 161463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: br i1 %[[E1]] 1622d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_load_invalid_value( 163463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith int a = e1; 164463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith 165463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[E2HI:.*]] = icmp sle i32 {{.*}}, 127 166463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[E2LO:.*]] = icmp sge i32 {{.*}}, -128 167463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[E2:.*]] = and i1 %[[E2HI]], %[[E2LO]] 168463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: br i1 %[[E2]] 1692d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_load_invalid_value( 170463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith int b = e2; 171463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith 172463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[E3:.*]] = icmp ule i32 {{.*}}, 2147483647 173463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: br i1 %[[E3]] 1742d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_load_invalid_value( 175463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith int c = e3; 176463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith return a + b + c; 177463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith} 178c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 179c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith// CHECK: @_Z20bad_downcast_pointer 180c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smithvoid bad_downcast_pointer(S *p) { 181c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[NONNULL:.*]] = icmp ne {{.*}}, null 182c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br i1 %[[NONNULL]], 183c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 184c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64( 185c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E1:.*]] = icmp uge i64 %[[SIZE]], 24 186c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[MISALIGN:.*]] = and i64 %{{.*}}, 7 187c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E2:.*]] = icmp eq i64 %[[MISALIGN]], 0 188c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E12:.*]] = and i1 %[[E1]], %[[E2]] 189c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br i1 %[[E12]], 190c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 191c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: call void @__ubsan_handle_type_mismatch 192c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br label 193c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 194c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br i1 %{{.*}}, 195c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 196c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss 197c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br label 198c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith (void) static_cast<T*>(p); 199c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith} 200c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 201c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith// CHECK: @_Z22bad_downcast_reference 202c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smithvoid bad_downcast_reference(S &p) { 203c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E1:.*]] = icmp ne {{.*}}, null 204c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK-NOT: br i1 205c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64( 206c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E2:.*]] = icmp uge i64 %[[SIZE]], 24 207c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E12:.*]] = and i1 %[[E1]], %[[E2]] 208c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[MISALIGN:.*]] = and i64 %{{.*}}, 7 209c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E3:.*]] = icmp eq i64 %[[MISALIGN]], 0 210c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E123:.*]] = and i1 %[[E12]], %[[E3]] 211c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br i1 %[[E123]], 212c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 213c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: call void @__ubsan_handle_type_mismatch 214c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br label 215c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 216c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br i1 %{{.*}}, 217c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 218c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss 219c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br label 220c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith (void) static_cast<T&>(p); 221c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith} 2224e1125f630e75a52209b928e9d43b638abf39987Bill Wendling 223a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith// CHECK: @_Z11array_index 224a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint array_index(const int (&a)[4], int n) { 225a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[K1_OK:.*]] = icmp ult i64 %{{.*}}, 4 226a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[K1_OK]] 227a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 228a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int k1 = a[n]; 229a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 230a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[R1_OK:.*]] = icmp ule i64 %{{.*}}, 4 231a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[R1_OK]] 232a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 233a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith const int *r1 = &a[n]; 234a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 235a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[K2_OK:.*]] = icmp ult i64 %{{.*}}, 8 236a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[K2_OK]] 237a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 238a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int k2 = ((const int(&)[8])a)[n]; 239a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 240a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[K3_OK:.*]] = icmp ult i64 %{{.*}}, 4 241a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[K3_OK]] 242a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 243a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int k3 = n[a]; 244a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 245a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return k1 + *r1 + k2; 246a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 247a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 248a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith// CHECK: @_Z17multi_array_index 249a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint multi_array_index(int n, int m) { 250a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int arr[4][6]; 251a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 252a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[IDX2_OK:.*]] = icmp ult i64 %{{.*}}, 6 253a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[IDX2_OK]] 254a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 255a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 256a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[IDX1_OK:.*]] = icmp ult i64 %{{.*}}, 4 257a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[IDX1_OK]] 258a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 259a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return arr[n][m]; 260a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 261a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 262a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith// CHECK: @_Z11array_arith 263a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint array_arith(const int (&a)[4], int n) { 264a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[K1_OK:.*]] = icmp ule i64 %{{.*}}, 4 265a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[K1_OK]] 266a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 267a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith const int *k1 = a + n; 268a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 269a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[K2_OK:.*]] = icmp ule i64 %{{.*}}, 8 270a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[K2_OK]] 271a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 272a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith const int *k2 = (const int(&)[8])a + n; 273a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 274a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return *k1 + *k2; 275a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 276a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 277a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithstruct ArrayMembers { 278a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int a1[5]; 279a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int a2[1]; 280a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith}; 281a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith// CHECK: @_Z18struct_array_index 282a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint struct_array_index(ArrayMembers *p, int n) { 283a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[IDX_OK:.*]] = icmp ult i64 %{{.*}}, 5 284a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[IDX_OK]] 285a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 286a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return p->a1[n]; 287a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 288a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 289a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith// CHECK: @_Z16flex_array_index 290a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint flex_array_index(ArrayMembers *p, int n) { 291a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK-NOT: call void @__ubsan_handle_out_of_bounds( 292a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return p->a2[n]; 293a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 294a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 2955956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smithextern int incomplete[]; 2965956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smith// CHECK: @_Z22incomplete_array_index 2975956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smithint incomplete_array_index(int n) { 2985956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smith // CHECK-NOT: call void @__ubsan_handle_out_of_bounds( 2995956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smith return incomplete[n]; 3005956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smith} 3015956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smith 302a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithtypedef __attribute__((ext_vector_type(4))) int V4I; 303a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith// CHECK: @_Z12vector_index 304a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint vector_index(V4I v, int n) { 305a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[IDX_OK:.*]] = icmp ult i64 %{{.*}}, 4 306a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[IDX_OK]] 307a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 308a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return v[n]; 309a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 310a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 311a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith// CHECK: @_Z12string_index 312a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithchar string_index(int n) { 313a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[IDX_OK:.*]] = icmp ult i64 %{{.*}}, 6 314a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[IDX_OK]] 315a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 316a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return "Hello"[n]; 317a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 318a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 3194e1125f630e75a52209b928e9d43b638abf39987Bill Wendling// CHECK: attributes [[NR_NUW]] = { noreturn nounwind } 320