1 // RUN: %clang_cc1 -fsanitize=implicit-unsigned-integer-truncation,implicit-signed-integer-truncation -fsanitize-recover=implicit-unsigned-integer-truncation,implicit-signed-integer-truncation -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s -implicit-check-not="call void @__ubsan_handle_implicit_conversion" --check-prefixes=CHECK 2 3 // CHECK-DAG: @[[LINE_100_UNSIGNED_TRUNCATION:.*]] = {{.*}}, i32 100, i32 10 }, {{.*}}, {{.*}}, i8 1 } 4 // CHECK-DAG: @[[LINE_200_UNSIGNED_TRUNCATION:.*]] = {{.*}}, i32 200, i32 10 }, {{.*}}, {{.*}}, i8 1 } 5 // CHECK-DAG: @[[LINE_300_SIGNED_TRUNCATION:.*]] = {{.*}}, i32 300, i32 10 }, {{.*}}, {{.*}}, i8 2 } 6 // CHECK-DAG: @[[LINE_400_SIGNED_TRUNCATION:.*]] = {{.*}}, i32 400, i32 10 }, {{.*}}, {{.*}}, i8 2 } 7 8 //----------------------------------------------------------------------------// 9 // Unsigned case. 10 //----------------------------------------------------------------------------// 11 12 // CHECK-LABEL: @ignorelist_0_convert_unsigned_int_to_unsigned_char 13 __attribute__((no_sanitize("undefined"))) unsigned char ignorelist_0_convert_unsigned_int_to_unsigned_char(unsigned int x) { 14 // We are not in "undefined" group, so that doesn't work. 15 // CHECK: call void @__ubsan_handle_implicit_conversion(i8* bitcast ({ {{{.*}}}, {{{.*}}}*, {{{.*}}}*, i8 }* @[[LINE_100_UNSIGNED_TRUNCATION]] to i8*) 16 #line 100 17 return x; 18 } 19 20 // CHECK-LABEL: @ignorelist_1_convert_unsigned_int_to_unsigned_char 21 __attribute__((no_sanitize("integer"))) unsigned char ignorelist_1_convert_unsigned_int_to_unsigned_char(unsigned int x) { 22 return x; 23 } 24 25 // CHECK-LABEL: @ignorelist_2_convert_unsigned_int_to_unsigned_char 26 __attribute__((no_sanitize("implicit-conversion"))) unsigned char ignorelist_2_convert_unsigned_int_to_unsigned_char(unsigned int x) { 27 return x; 28 } 29 30 // CHECK-LABEL: @ignorelist_3_convert_unsigned_int_to_unsigned_char 31 __attribute__((no_sanitize("implicit-integer-truncation"))) unsigned char ignorelist_3_convert_unsigned_int_to_unsigned_char(unsigned int x) { 32 return x; 33 } 34 35 // CHECK-LABEL: @ignorelist_4_convert_unsigned_int_to_unsigned_char 36 __attribute__((no_sanitize("implicit-unsigned-integer-truncation"))) unsigned char ignorelist_4_convert_unsigned_int_to_unsigned_char(unsigned int x) { 37 return x; 38 } 39 40 // CHECK-LABEL: @ignorelist_5_convert_unsigned_int_to_unsigned_char 41 __attribute__((no_sanitize("implicit-signed-integer-truncation"))) unsigned char ignorelist_5_convert_unsigned_int_to_unsigned_char(unsigned int x) { 42 // This is an unsigned truncation, not signed-one. 43 // CHECK: call void @__ubsan_handle_implicit_conversion(i8* bitcast ({ {{{.*}}}, {{{.*}}}*, {{{.*}}}*, i8 }* @[[LINE_200_UNSIGNED_TRUNCATION]] to i8*) 44 #line 200 45 return x; 46 } 47 48 //----------------------------------------------------------------------------// 49 // Signed case. 50 //----------------------------------------------------------------------------// 51 52 // CHECK-LABEL: @ignorelist_0_convert_signed_int_to_signed_char 53 __attribute__((no_sanitize("undefined"))) signed char ignorelist_0_convert_signed_int_to_signed_char(signed int x) { 54 // We are not in "undefined" group, so that doesn't work. 55 // CHECK: call void @__ubsan_handle_implicit_conversion(i8* bitcast ({ {{{.*}}}, {{{.*}}}*, {{{.*}}}*, i8 }* @[[LINE_300_SIGNED_TRUNCATION]] to i8*) 56 #line 300 57 return x; 58 } 59 60 // CHECK-LABEL: @ignorelist_1_convert_signed_int_to_signed_char 61 __attribute__((no_sanitize("integer"))) signed char ignorelist_1_convert_signed_int_to_signed_char(signed int x) { 62 return x; 63 } 64 65 // CHECK-LABEL: @ignorelist_2_convert_signed_int_to_signed_char 66 __attribute__((no_sanitize("implicit-conversion"))) signed char ignorelist_2_convert_signed_int_to_signed_char(signed int x) { 67 return x; 68 } 69 70 // CHECK-LABEL: @ignorelist_3_convert_signed_int_to_signed_char 71 __attribute__((no_sanitize("implicit-integer-truncation"))) signed char ignorelist_3_convert_signed_int_to_signed_char(signed int x) { 72 return x; 73 } 74 75 // CHECK-LABEL: @ignorelist_4_convert_signed_int_to_signed_char 76 __attribute__((no_sanitize("implicit-signed-integer-truncation"))) signed char ignorelist_4_convert_signed_int_to_signed_char(signed int x) { 77 return x; 78 } 79 80 // CHECK-LABEL: @ignorelist_5_convert_signed_int_to_signed_char 81 __attribute__((no_sanitize("implicit-unsigned-integer-truncation"))) signed char ignorelist_5_convert_signed_int_to_signed_char(signed int x) { 82 // This is an signed truncation, not unsigned-one. 83 // CHECK: call void @__ubsan_handle_implicit_conversion(i8* bitcast ({ {{{.*}}}, {{{.*}}}*, {{{.*}}}*, i8 }* @[[LINE_400_SIGNED_TRUNCATION]] to i8*) 84 #line 400 85 return x; 86 } 87