mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Fix integer sanitizer issues in shifts and test ranges
libeigen/eigen!2320 Co-authored-by: Rasmus Munk Larsen <rmlarsen@gmail.com>
This commit is contained in:
@@ -1923,7 +1923,8 @@ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double fmod(const double& a, const double&
|
||||
|
||||
template <typename Scalar, typename Enable = std::enable_if_t<std::is_integral<Scalar>::value>>
|
||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar logical_shift_left(const Scalar& a, int n) {
|
||||
return a << n;
|
||||
using UnsignedScalar = typename numext::get_integer_by_size<sizeof(Scalar)>::unsigned_type;
|
||||
return bit_cast<Scalar, UnsignedScalar>(bit_cast<UnsignedScalar, Scalar>(a) << n);
|
||||
}
|
||||
|
||||
template <typename Scalar, typename Enable = std::enable_if_t<std::is_integral<Scalar>::value>>
|
||||
|
||||
@@ -44,6 +44,19 @@ void check_negate() {
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
std::enable_if_t<NumTraits<T>::IsInteger, T> random_abs2_input() {
|
||||
const T safeAbs2Input = static_cast<T>(std::sqrt(static_cast<long double>(NumTraits<T>::highest())));
|
||||
return NumTraits<T>::IsSigned ? internal::random<T>(-safeAbs2Input, safeAbs2Input)
|
||||
: internal::random<T>(T(0), safeAbs2Input);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
std::enable_if_t<!NumTraits<T>::IsInteger, T> random_abs2_input() {
|
||||
typedef typename NumTraits<T>::Real Real;
|
||||
return internal::random<T>() / Real(2);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void check_abs() {
|
||||
typedef typename NumTraits<T>::Real Real;
|
||||
@@ -54,8 +67,7 @@ void check_abs() {
|
||||
VERIFY_IS_EQUAL(numext::abs(T(1)), T(1));
|
||||
|
||||
for (int k = 0; k < 100; ++k) {
|
||||
T x = internal::random<T>();
|
||||
x = x / Real(2);
|
||||
T x = random_abs2_input<T>();
|
||||
if (NumTraits<T>::IsSigned) {
|
||||
VERIFY_IS_EQUAL(numext::abs(x), numext::abs(numext::negate(x)));
|
||||
VERIFY(numext::abs(numext::negate(x)) >= zero);
|
||||
@@ -301,7 +313,7 @@ void check_shift() {
|
||||
const T a = internal::random<T>();
|
||||
for (int s = 1; s < kNumBits; s++) {
|
||||
T a_bsll = numext::logical_shift_left(a, s);
|
||||
T a_bsll_ref = a << s;
|
||||
T a_bsll_ref = numext::bit_cast<T, UnsignedT>(numext::bit_cast<UnsignedT, T>(a) << s);
|
||||
VERIFY_IS_EQUAL(a_bsll, a_bsll_ref);
|
||||
T a_bsrl = numext::logical_shift_right(a, s);
|
||||
T a_bsrl_ref = numext::bit_cast<T, UnsignedT>(numext::bit_cast<UnsignedT, T>(a) >> s);
|
||||
|
||||
@@ -81,15 +81,24 @@ void product(const MatrixType& m) {
|
||||
|
||||
// Prevent overflows for integer types.
|
||||
if (Eigen::NumTraits<Scalar>::IsInteger) {
|
||||
Scalar kMaxVal = Scalar(10000);
|
||||
Scalar kMaxVal = Scalar(8);
|
||||
m1.array() = m1.array() - kMaxVal * (m1.array() / kMaxVal);
|
||||
m2.array() = m2.array() - kMaxVal * (m2.array() / kMaxVal);
|
||||
square.array() = square.array() - kMaxVal * (square.array() / kMaxVal);
|
||||
res.array() = res.array() - kMaxVal * (res.array() / kMaxVal);
|
||||
square2.array() = square2.array() - kMaxVal * (square2.array() / kMaxVal);
|
||||
res2.array() = res2.array() - kMaxVal * (res2.array() / kMaxVal);
|
||||
v1.array() = v1.array() - kMaxVal * (v1.array() / kMaxVal);
|
||||
vc2.array() = vc2.array() - kMaxVal * (vc2.array() / kMaxVal);
|
||||
}
|
||||
|
||||
OtherMajorMatrixType tm1 = m1;
|
||||
|
||||
Scalar s1 = internal::random<Scalar>();
|
||||
if (Eigen::NumTraits<Scalar>::IsInteger) {
|
||||
Scalar kMaxVal = Scalar(8);
|
||||
s1 = s1 - kMaxVal * (s1 / kMaxVal);
|
||||
}
|
||||
|
||||
Index r = internal::random<Index>(0, rows - 1), c = internal::random<Index>(0, cols - 1),
|
||||
c2 = internal::random<Index>(0, cols - 1);
|
||||
|
||||
@@ -32,7 +32,7 @@ void matrixRedux(const MatrixType& m) {
|
||||
m2.setRandom();
|
||||
// Prevent overflows for integer types.
|
||||
if (Eigen::NumTraits<Scalar>::IsInteger) {
|
||||
Scalar kMaxVal = Scalar(10000);
|
||||
Scalar kMaxVal = Scalar(8);
|
||||
m1.array() = m1.array() - kMaxVal * (m1.array() / kMaxVal);
|
||||
m2.array() = m2.array() - kMaxVal * (m2.array() / kMaxVal);
|
||||
}
|
||||
@@ -98,6 +98,11 @@ void vectorRedux(const VectorType& w) {
|
||||
|
||||
VectorType v = VectorType::Random(size);
|
||||
VectorType v_for_prod = VectorType::Ones(size) + Scalar(0.2) * v; // see comment above declaration of m1_for_prod
|
||||
if (Eigen::NumTraits<Scalar>::IsInteger) {
|
||||
Scalar kMaxVal = Scalar(8);
|
||||
v.array() = v.array() - kMaxVal * (v.array() / kMaxVal);
|
||||
v_for_prod = VectorType::Ones(size) + Scalar(0.2) * v;
|
||||
}
|
||||
|
||||
for (int i = 1; i < size; i++) {
|
||||
Scalar s(0), p(1);
|
||||
|
||||
Reference in New Issue
Block a user