CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
257 lines
8.8 KiB
C++
257 lines
8.8 KiB
C++
// RUN: %clang_cc1 -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK
|
|
// RUN: %clang_cc1 -fsanitize=implicit-unsigned-integer-truncation,implicit-signed-integer-truncation -fno-sanitize-recover=implicit-unsigned-integer-truncation,implicit-signed-integer-truncation -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefixes=CHECK,CHECK-SANITIZE
|
|
// 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 --check-prefixes=CHECK,CHECK-SANITIZE
|
|
// RUN: %clang_cc1 -fsanitize=implicit-unsigned-integer-truncation,implicit-signed-integer-truncation -fsanitize-trap=implicit-unsigned-integer-truncation,implicit-signed-integer-truncation -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefixes=CHECK,CHECK-SANITIZE
|
|
|
|
extern "C" { // Disable name mangling.
|
|
|
|
// ========================================================================== //
|
|
// Check that explicit cast does not interfere with implicit conversion
|
|
// ========================================================================== //
|
|
// These contain one implicit truncating conversion, and one explicit truncating cast.
|
|
// We want to make sure that we still diagnose the implicit conversion.
|
|
|
|
// Implicit truncation after explicit truncation.
|
|
// CHECK-LABEL: @explicit_cast_interference0
|
|
unsigned char explicit_cast_interference0(unsigned int c) {
|
|
// CHECK-SANITIZE: %[[ANYEXT:.*]] = zext i8 %[[DST:.*]] to i16, !nosanitize
|
|
// CHECK-SANITIZE: call
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return (unsigned short)c;
|
|
}
|
|
|
|
// Implicit truncation before explicit truncation.
|
|
// CHECK-LABEL: @explicit_cast_interference1
|
|
unsigned char explicit_cast_interference1(unsigned int c) {
|
|
// CHECK-SANITIZE: %[[ANYEXT:.*]] = zext i16 %[[DST:.*]] to i32, !nosanitize
|
|
// CHECK-SANITIZE: call
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
unsigned short b;
|
|
return (unsigned char)(b = c);
|
|
}
|
|
|
|
// ========================================================================== //
|
|
// The expected true-negatives.
|
|
// ========================================================================== //
|
|
|
|
// Explicit truncating casts.
|
|
// ========================================================================== //
|
|
|
|
// CHECK-LABEL: @explicit_unsigned_int_to_unsigned_char
|
|
unsigned char explicit_unsigned_int_to_unsigned_char(unsigned int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return (unsigned char)src;
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_signed_int_to_unsigned_char
|
|
unsigned char explicit_signed_int_to_unsigned_char(signed int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return (unsigned char)src;
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_unsigned_int_to_signed_char
|
|
signed char explicit_unsigned_int_to_signed_char(unsigned int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return (signed char)src;
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_signed_int_to_signed_char
|
|
signed char explicit_signed_int_to_signed_char(signed int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return (signed char)src;
|
|
}
|
|
|
|
// Explicit NOP casts.
|
|
// ========================================================================== //
|
|
|
|
// CHECK-LABEL: @explicit_unsigned_int_to_unsigned_int
|
|
unsigned int explicit_unsigned_int_to_unsigned_int(unsigned int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return (unsigned int)src;
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_signed_int_to_signed_int
|
|
signed int explicit_signed_int_to_signed_int(signed int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return (signed int)src;
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_unsigned_char_to_signed_char
|
|
unsigned char explicit_unsigned_char_to_signed_char(unsigned char src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return (unsigned char)src;
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_signed_char_to_signed_char
|
|
signed char explicit_signed_char_to_signed_char(signed char src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return (signed char)src;
|
|
}
|
|
|
|
// Explicit functional truncating casts.
|
|
// ========================================================================== //
|
|
|
|
using UnsignedChar = unsigned char;
|
|
using SignedChar = signed char;
|
|
using UnsignedInt = unsigned int;
|
|
using SignedInt = signed int;
|
|
|
|
// CHECK-LABEL: @explicit_functional_unsigned_int_to_unsigned_char
|
|
unsigned char explicit_functional_unsigned_int_to_unsigned_char(unsigned int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return UnsignedChar(src);
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_functional_signed_int_to_unsigned_char
|
|
unsigned char explicit_functional_signed_int_to_unsigned_char(signed int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return UnsignedChar(src);
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_functional_unsigned_int_to_signed_char
|
|
signed char explicit_functional_unsigned_int_to_signed_char(unsigned int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return SignedChar(src);
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_functional_signed_int_to_signed_char
|
|
signed char explicit_functional_signed_int_to_signed_char(signed int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return SignedChar(src);
|
|
}
|
|
|
|
// Explicit functional NOP casts.
|
|
// ========================================================================== //
|
|
|
|
// CHECK-LABEL: @explicit_functional_unsigned_int_to_unsigned_int
|
|
unsigned int explicit_functional_unsigned_int_to_unsigned_int(unsigned int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return UnsignedInt(src);
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_functional_signed_int_to_signed_int
|
|
signed int explicit_functional_signed_int_to_signed_int(signed int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return SignedInt(src);
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_functional_unsigned_char_to_signed_char
|
|
unsigned char explicit_functional_unsigned_char_to_signed_char(unsigned char src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return UnsignedChar(src);
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_functional_signed_char_to_signed_char
|
|
signed char explicit_functional_signed_char_to_signed_char(signed char src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return SignedChar(src);
|
|
}
|
|
|
|
// Explicit C++-style casts truncating casts.
|
|
// ========================================================================== //
|
|
|
|
// CHECK-LABEL: @explicit_cppstyleunsigned_int_to_unsigned_char
|
|
unsigned char explicit_cppstyleunsigned_int_to_unsigned_char(unsigned int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return static_cast<unsigned char>(src);
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_cppstylesigned_int_to_unsigned_char
|
|
unsigned char explicit_cppstylesigned_int_to_unsigned_char(signed int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return static_cast<unsigned char>(src);
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_cppstyleunsigned_int_to_signed_char
|
|
signed char explicit_cppstyleunsigned_int_to_signed_char(unsigned int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return static_cast<signed char>(src);
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_cppstylesigned_int_to_signed_char
|
|
signed char explicit_cppstylesigned_int_to_signed_char(signed int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return static_cast<signed char>(src);
|
|
}
|
|
|
|
// Explicit C++-style casts NOP casts.
|
|
// ========================================================================== //
|
|
|
|
// CHECK-LABEL: @explicit_cppstyleunsigned_int_to_unsigned_int
|
|
unsigned int explicit_cppstyleunsigned_int_to_unsigned_int(unsigned int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return static_cast<unsigned int>(src);
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_cppstylesigned_int_to_signed_int
|
|
signed int explicit_cppstylesigned_int_to_signed_int(signed int src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return static_cast<signed int>(src);
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_cppstyleunsigned_char_to_signed_char
|
|
unsigned char explicit_cppstyleunsigned_char_to_signed_char(unsigned char src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return static_cast<unsigned char>(src);
|
|
}
|
|
|
|
// CHECK-LABEL: @explicit_cppstylesigned_char_to_signed_char
|
|
signed char explicit_cppstylesigned_char_to_signed_char(signed char src) {
|
|
// CHECK-SANITIZE-NOT: call
|
|
// CHECK: }
|
|
return static_cast<signed char>(src);
|
|
}
|
|
|
|
} // extern "C"
|
|
|
|
// ---------------------------------------------------------------------------//
|
|
// A problematic true-negative involving simple C++ code.
|
|
// The problem is tha the NoOp ExplicitCast is directly within MaterializeTemporaryExpr(),
|
|
// so a special care is neeeded.
|
|
// See https://reviews.llvm.org/D48958#1161345
|
|
template <typename a>
|
|
a b(a c, const a &d) {
|
|
if (d)
|
|
;
|
|
return c;
|
|
}
|
|
|
|
extern "C" { // Disable name mangling.
|
|
|
|
// CHECK-LABEL: @false_positive_with_MaterializeTemporaryExpr
|
|
int false_positive_with_MaterializeTemporaryExpr() {
|
|
// CHECK-SANITIZE-NOT: call{{.*}}ubsan
|
|
// CHECK: }
|
|
int e = b<unsigned>(4, static_cast<unsigned>(4294967296));
|
|
return e;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------//
|
|
|
|
} // extern "C"
|