150 lines · cpp
1// RUN: %clang_cc1 -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK2// 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-SANITIZE3// 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-SANITIZE4// 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-SANITIZE5 6extern "C" { // Disable name mangling.7 8// ========================================================================== //9// The expected true-negatives.10// ========================================================================== //11 12// Sanitization is explicitly disabled.13// ========================================================================== //14 15// CHECK-LABEL: @ignorelist_016__attribute__((no_sanitize("undefined"))) unsigned int ignorelist_0(signed int src) {17 // We are not in "undefined" group, so that doesn't work.18 // CHECK-SANITIZE: call19 // CHECK: }20 return src;21}22 23// CHECK-LABEL: @ignorelist_124__attribute__((no_sanitize("integer"))) unsigned int ignorelist_1(signed int src) {25 // CHECK-SANITIZE-NOT: call26 // CHECK: }27 return src;28}29 30// CHECK-LABEL: @ignorelist_231__attribute__((no_sanitize("implicit-conversion"))) unsigned int ignorelist_2(signed int src) {32 // CHECK-SANITIZE-NOT: call33 // CHECK: }34 return src;35}36 37// CHECK-LABEL: @ignorelist_338__attribute__((no_sanitize("implicit-integer-sign-change"))) unsigned int ignorelist_3(signed int src) {39 // CHECK-SANITIZE-NOT: call40 // CHECK: }41 return src;42}43 44// Explicit sign-changing conversions.45// ========================================================================== //46 47// CHECK-LABEL: @explicit_signed_int_to_unsigned_int48unsigned int explicit_signed_int_to_unsigned_int(signed int src) {49 // CHECK-SANITIZE-NOT: call50 // CHECK: }51 return (unsigned int)src;52}53 54// CHECK-LABEL: @explicit_unsigned_int_to_signed_int55signed int explicit_unsigned_int_to_signed_int(unsigned int src) {56 // CHECK-SANITIZE-NOT: call57 // CHECK: }58 return (signed int)src;59}60 61// Explicit NOP conversions.62// ========================================================================== //63 64// CHECK-LABEL: @explicit_unsigned_int_to_unsigned_int65unsigned int explicit_unsigned_int_to_unsigned_int(unsigned int src) {66 // CHECK-SANITIZE-NOT: call67 // CHECK: }68 return (unsigned int)src;69}70 71// CHECK-LABEL: @explicit_signed_int_to_signed_int72signed int explicit_signed_int_to_signed_int(signed int src) {73 // CHECK-SANITIZE-NOT: call74 // CHECK: }75 return (signed int)src;76}77 78// Explicit functional sign-changing casts.79// ========================================================================== //80 81using UnsignedInt = unsigned int;82using SignedInt = signed int;83 84// CHECK-LABEL: explicit_functional_unsigned_int_to_signed_int85signed int explicit_functional_unsigned_int_to_signed_int(unsigned int src) {86 // CHECK-SANITIZE-NOT: call87 // CHECK: }88 return SignedInt(src);89}90 91// CHECK-LABEL: @explicit_functional_signed_int_to_unsigned_int92unsigned int explicit_functional_signed_int_to_unsigned_int(signed int src) {93 // CHECK-SANITIZE-NOT: call94 // CHECK: }95 return UnsignedInt(src);96}97 98// Explicit functional NOP casts.99// ========================================================================== //100 101// CHECK-LABEL: @explicit_functional_unsigned_int_to_unsigned_int102unsigned int explicit_functional_unsigned_int_to_unsigned_int(unsigned int src) {103 // CHECK-SANITIZE-NOT: call104 // CHECK: }105 return UnsignedInt(src);106}107 108// CHECK-LABEL: @explicit_functional_signed_int_to_signed_int109signed int explicit_functional_signed_int_to_signed_int(signed int src) {110 // CHECK-SANITIZE-NOT: call111 // CHECK: }112 return SignedInt(src);113}114 115// Explicit C++-style sign-changing casts.116// ========================================================================== //117 118// CHECK-LABEL: @explicit_cppstyle_unsigned_int_to_signed_int119signed int explicit_cppstyle_unsigned_int_to_signed_int(unsigned int src) {120 // CHECK-SANITIZE-NOT: call121 // CHECK: }122 return static_cast<signed int>(src);123}124 125// CHECK-LABEL: @explicit_cppstyle_signed_int_to_unsigned_int126unsigned int explicit_cppstyle_signed_int_to_unsigned_int(signed int src) {127 // CHECK-SANITIZE-NOT: call128 // CHECK: }129 return static_cast<unsigned int>(src);130}131 132// Explicit C++-style casts NOP casts.133// ========================================================================== //134 135// CHECK-LABEL: @explicit_cppstyle_unsigned_int_to_unsigned_int136unsigned int explicit_cppstyle_unsigned_int_to_unsigned_int(unsigned int src) {137 // CHECK-SANITIZE-NOT: call138 // CHECK: }139 return static_cast<unsigned int>(src);140}141 142// CHECK-LABEL: @explicit_cppstyle_signed_int_to_signed_int143signed int explicit_cppstyle_signed_int_to_signed_int(signed int src) {144 // CHECK-SANITIZE-NOT: call145 // CHECK: }146 return static_cast<signed int>(src);147}148 149} // extern "C"150