1 // RUN: %clang_cc1 -fsanitize=implicit-unsigned-integer-truncation -fsanitize-recover=implicit-unsigned-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 6 // CHECK-LABEL: @ignorelist_0_convert_unsigned_int_to_unsigned_char 7 __attribute__((no_sanitize("undefined"))) unsigned char ignorelist_0_convert_unsigned_int_to_unsigned_char(unsigned int x) { 8 // We are not in "undefined" group, so that doesn't work. 9 // CHECK: call void @__ubsan_handle_implicit_conversion(i8* bitcast ({ {{{.*}}}, {{{.*}}}*, {{{.*}}}*, i8 }* @[[LINE_100_UNSIGNED_TRUNCATION]] to i8*) 10 #line 100 11 return x; 12 } 13 14 // CHECK-LABEL: @ignorelist_1_convert_unsigned_int_to_unsigned_char 15 __attribute__((no_sanitize("integer"))) unsigned char ignorelist_1_convert_unsigned_int_to_unsigned_char(unsigned int x) { 16 return x; 17 } 18 19 // CHECK-LABEL: @ignorelist_2_convert_unsigned_int_to_unsigned_char 20 __attribute__((no_sanitize("implicit-conversion"))) unsigned char ignorelist_2_convert_unsigned_int_to_unsigned_char(unsigned int x) { 21 return x; 22 } 23 24 // CHECK-LABEL: @ignorelist_3_convert_unsigned_int_to_unsigned_char 25 __attribute__((no_sanitize("implicit-integer-truncation"))) unsigned char ignorelist_3_convert_unsigned_int_to_unsigned_char(unsigned int x) { 26 return x; 27 } 28 29 // CHECK-LABEL: @ignorelist_4_convert_unsigned_int_to_unsigned_char 30 __attribute__((no_sanitize("implicit-unsigned-integer-truncation"))) unsigned char ignorelist_4_convert_unsigned_int_to_unsigned_char(unsigned int x) { 31 return x; 32 } 33 34 // CHECK-LABEL: @ignorelist_5_convert_unsigned_int_to_unsigned_char 35 __attribute__((no_sanitize("implicit-signed-integer-truncation"))) unsigned char ignorelist_5_convert_unsigned_int_to_unsigned_char(unsigned int x) { 36 // This is an unsigned truncation, not signed-one. 37 // CHECK: call void @__ubsan_handle_implicit_conversion(i8* bitcast ({ {{{.*}}}, {{{.*}}}*, {{{.*}}}*, i8 }* @[[LINE_200_UNSIGNED_TRUNCATION]] to i8*) 38 #line 200 39 return x; 40 } 41