1*62debd80SRoman Lebedev // RUN: %clang_cc1 -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK 2*62debd80SRoman Lebedev // RUN: %clang_cc1 -fsanitize=implicit-integer-sign-change -fno-sanitize-recover=implicit-integer-sign-change -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefixes=CHECK,CHECK-SANITIZE,CHECK-SANITIZE-ANYRECOVER,CHECK-SANITIZE-NORECOVER 3*62debd80SRoman Lebedev // RUN: %clang_cc1 -fsanitize=implicit-integer-sign-change -fsanitize-recover=implicit-integer-sign-change -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefixes=CHECK,CHECK-SANITIZE,CHECK-SANITIZE-ANYRECOVER,CHECK-SANITIZE-RECOVER 4*62debd80SRoman Lebedev // RUN: %clang_cc1 -fsanitize=implicit-integer-sign-change -fsanitize-trap=implicit-integer-sign-change -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefixes=CHECK,CHECK-SANITIZE,CHECK-SANITIZE-TRAP 5*62debd80SRoman Lebedev 6*62debd80SRoman Lebedev extern "C" { // Disable name mangling. 7*62debd80SRoman Lebedev 8*62debd80SRoman Lebedev // ========================================================================== // 9*62debd80SRoman Lebedev // The expected true-negatives. 10*62debd80SRoman Lebedev // ========================================================================== // 11*62debd80SRoman Lebedev 12*62debd80SRoman Lebedev // Sanitization is explicitly disabled. 13*62debd80SRoman Lebedev // ========================================================================== // 14*62debd80SRoman Lebedev 15*62debd80SRoman Lebedev // CHECK-LABEL: @blacklist_0 16*62debd80SRoman Lebedev __attribute__((no_sanitize("undefined"))) unsigned int blacklist_0(signed int src) { 17*62debd80SRoman Lebedev // We are not in "undefined" group, so that doesn't work. 18*62debd80SRoman Lebedev // CHECK-SANITIZE: call 19*62debd80SRoman Lebedev // CHECK: } 20*62debd80SRoman Lebedev return src; 21*62debd80SRoman Lebedev } 22*62debd80SRoman Lebedev 23*62debd80SRoman Lebedev // CHECK-LABEL: @blacklist_1 24*62debd80SRoman Lebedev __attribute__((no_sanitize("integer"))) unsigned int blacklist_1(signed int src) { 25*62debd80SRoman Lebedev // CHECK-SANITIZE-NOT: call 26*62debd80SRoman Lebedev // CHECK: } 27*62debd80SRoman Lebedev return src; 28*62debd80SRoman Lebedev } 29*62debd80SRoman Lebedev 30*62debd80SRoman Lebedev // CHECK-LABEL: @blacklist_2 31*62debd80SRoman Lebedev __attribute__((no_sanitize("implicit-conversion"))) unsigned int blacklist_2(signed int src) { 32*62debd80SRoman Lebedev // CHECK-SANITIZE-NOT: call 33*62debd80SRoman Lebedev // CHECK: } 34*62debd80SRoman Lebedev return src; 35*62debd80SRoman Lebedev } 36*62debd80SRoman Lebedev 37*62debd80SRoman Lebedev // CHECK-LABEL: @blacklist_3 38*62debd80SRoman Lebedev __attribute__((no_sanitize("implicit-integer-sign-change"))) unsigned int blacklist_3(signed int src) { 39*62debd80SRoman Lebedev // CHECK-SANITIZE-NOT: call 40*62debd80SRoman Lebedev // CHECK: } 41*62debd80SRoman Lebedev return src; 42*62debd80SRoman Lebedev } 43*62debd80SRoman Lebedev 44*62debd80SRoman Lebedev // Explicit sign-changing conversions. 45*62debd80SRoman Lebedev // ========================================================================== // 46*62debd80SRoman Lebedev 47*62debd80SRoman Lebedev // CHECK-LABEL: @explicit_signed_int_to_unsigned_int 48*62debd80SRoman Lebedev unsigned int explicit_signed_int_to_unsigned_int(signed int src) { 49*62debd80SRoman Lebedev // CHECK-SANITIZE-NOT: call 50*62debd80SRoman Lebedev // CHECK: } 51*62debd80SRoman Lebedev return (unsigned int)src; 52*62debd80SRoman Lebedev } 53*62debd80SRoman Lebedev 54*62debd80SRoman Lebedev // CHECK-LABEL: @explicit_unsigned_int_to_signed_int 55*62debd80SRoman Lebedev signed int explicit_unsigned_int_to_signed_int(unsigned int src) { 56*62debd80SRoman Lebedev // CHECK-SANITIZE-NOT: call 57*62debd80SRoman Lebedev // CHECK: } 58*62debd80SRoman Lebedev return (signed int)src; 59*62debd80SRoman Lebedev } 60*62debd80SRoman Lebedev 61*62debd80SRoman Lebedev // Explicit NOP conversions. 62*62debd80SRoman Lebedev // ========================================================================== // 63*62debd80SRoman Lebedev 64*62debd80SRoman Lebedev // CHECK-LABEL: @explicit_unsigned_int_to_unsigned_int 65*62debd80SRoman Lebedev unsigned int explicit_unsigned_int_to_unsigned_int(unsigned int src) { 66*62debd80SRoman Lebedev // CHECK-SANITIZE-NOT: call 67*62debd80SRoman Lebedev // CHECK: } 68*62debd80SRoman Lebedev return (unsigned int)src; 69*62debd80SRoman Lebedev } 70*62debd80SRoman Lebedev 71*62debd80SRoman Lebedev // CHECK-LABEL: @explicit_signed_int_to_signed_int 72*62debd80SRoman Lebedev signed int explicit_signed_int_to_signed_int(signed int src) { 73*62debd80SRoman Lebedev // CHECK-SANITIZE-NOT: call 74*62debd80SRoman Lebedev // CHECK: } 75*62debd80SRoman Lebedev return (signed int)src; 76*62debd80SRoman Lebedev } 77*62debd80SRoman Lebedev 78*62debd80SRoman Lebedev // Explicit functional sign-changing casts. 79*62debd80SRoman Lebedev // ========================================================================== // 80*62debd80SRoman Lebedev 81*62debd80SRoman Lebedev using UnsignedInt = unsigned int; 82*62debd80SRoman Lebedev using SignedInt = signed int; 83*62debd80SRoman Lebedev 84*62debd80SRoman Lebedev // CHECK-LABEL: explicit_functional_unsigned_int_to_signed_int 85*62debd80SRoman Lebedev signed int explicit_functional_unsigned_int_to_signed_int(unsigned int src) { 86*62debd80SRoman Lebedev // CHECK-SANITIZE-NOT: call 87*62debd80SRoman Lebedev // CHECK: } 88*62debd80SRoman Lebedev return SignedInt(src); 89*62debd80SRoman Lebedev } 90*62debd80SRoman Lebedev 91*62debd80SRoman Lebedev // CHECK-LABEL: @explicit_functional_signed_int_to_unsigned_int 92*62debd80SRoman Lebedev unsigned int explicit_functional_signed_int_to_unsigned_int(signed int src) { 93*62debd80SRoman Lebedev // CHECK-SANITIZE-NOT: call 94*62debd80SRoman Lebedev // CHECK: } 95*62debd80SRoman Lebedev return UnsignedInt(src); 96*62debd80SRoman Lebedev } 97*62debd80SRoman Lebedev 98*62debd80SRoman Lebedev // Explicit functional NOP casts. 99*62debd80SRoman Lebedev // ========================================================================== // 100*62debd80SRoman Lebedev 101*62debd80SRoman Lebedev // CHECK-LABEL: @explicit_functional_unsigned_int_to_unsigned_int 102*62debd80SRoman Lebedev unsigned int explicit_functional_unsigned_int_to_unsigned_int(unsigned int src) { 103*62debd80SRoman Lebedev // CHECK-SANITIZE-NOT: call 104*62debd80SRoman Lebedev // CHECK: } 105*62debd80SRoman Lebedev return UnsignedInt(src); 106*62debd80SRoman Lebedev } 107*62debd80SRoman Lebedev 108*62debd80SRoman Lebedev // CHECK-LABEL: @explicit_functional_signed_int_to_signed_int 109*62debd80SRoman Lebedev signed int explicit_functional_signed_int_to_signed_int(signed int src) { 110*62debd80SRoman Lebedev // CHECK-SANITIZE-NOT: call 111*62debd80SRoman Lebedev // CHECK: } 112*62debd80SRoman Lebedev return SignedInt(src); 113*62debd80SRoman Lebedev } 114*62debd80SRoman Lebedev 115*62debd80SRoman Lebedev // Explicit C++-style sign-changing casts. 116*62debd80SRoman Lebedev // ========================================================================== // 117*62debd80SRoman Lebedev 118*62debd80SRoman Lebedev // CHECK-LABEL: @explicit_cppstyle_unsigned_int_to_signed_int 119*62debd80SRoman Lebedev signed int explicit_cppstyle_unsigned_int_to_signed_int(unsigned int src) { 120*62debd80SRoman Lebedev // CHECK-SANITIZE-NOT: call 121*62debd80SRoman Lebedev // CHECK: } 122*62debd80SRoman Lebedev return static_cast<signed int>(src); 123*62debd80SRoman Lebedev } 124*62debd80SRoman Lebedev 125*62debd80SRoman Lebedev // CHECK-LABEL: @explicit_cppstyle_signed_int_to_unsigned_int 126*62debd80SRoman Lebedev unsigned int explicit_cppstyle_signed_int_to_unsigned_int(signed int src) { 127*62debd80SRoman Lebedev // CHECK-SANITIZE-NOT: call 128*62debd80SRoman Lebedev // CHECK: } 129*62debd80SRoman Lebedev return static_cast<unsigned int>(src); 130*62debd80SRoman Lebedev } 131*62debd80SRoman Lebedev 132*62debd80SRoman Lebedev // Explicit C++-style casts NOP casts. 133*62debd80SRoman Lebedev // ========================================================================== // 134*62debd80SRoman Lebedev 135*62debd80SRoman Lebedev // CHECK-LABEL: @explicit_cppstyle_unsigned_int_to_unsigned_int 136*62debd80SRoman Lebedev unsigned int explicit_cppstyle_unsigned_int_to_unsigned_int(unsigned int src) { 137*62debd80SRoman Lebedev // CHECK-SANITIZE-NOT: call 138*62debd80SRoman Lebedev // CHECK: } 139*62debd80SRoman Lebedev return static_cast<unsigned int>(src); 140*62debd80SRoman Lebedev } 141*62debd80SRoman Lebedev 142*62debd80SRoman Lebedev // CHECK-LABEL: @explicit_cppstyle_signed_int_to_signed_int 143*62debd80SRoman Lebedev signed int explicit_cppstyle_signed_int_to_signed_int(signed int src) { 144*62debd80SRoman Lebedev // CHECK-SANITIZE-NOT: call 145*62debd80SRoman Lebedev // CHECK: } 146*62debd80SRoman Lebedev return static_cast<signed int>(src); 147*62debd80SRoman Lebedev } 148*62debd80SRoman Lebedev 149*62debd80SRoman Lebedev } // extern "C" 150