Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c52b3c08 authored by Andy Hung's avatar Andy Hung Committed by Gerrit Code Review
Browse files

Merge "Disable sanitization for LinearTransform"

parents 4a8d1255 13c19e77
Loading
Loading
Loading
Loading
+19 −2
Original line number Diff line number Diff line
@@ -21,11 +21,24 @@

#include <utils/LinearTransform.h>

// disable sanitize as these functions may intentionally overflow (see comments below).
// the ifdef can be removed when host builds use clang.
#if defined(__clang__)
#define ATTRIBUTE_NO_SANITIZE_INTEGER __attribute__((no_sanitize("integer")))
#else
#define ATTRIBUTE_NO_SANITIZE_INTEGER
#endif

namespace android {

template<class T> static inline T ABS(T x) { return (x < 0) ? -x : x; }
// sanitize failure with T = int32_t and x = 0x80000000
template<class T>
ATTRIBUTE_NO_SANITIZE_INTEGER
static inline T ABS(T x) { return (x < 0) ? -x : x; }

// Static math methods involving linear transformations
// remote sanitize failure on overflow case.
ATTRIBUTE_NO_SANITIZE_INTEGER
static bool scale_u64_to_u64(
        uint64_t val,
        uint32_t N,
@@ -109,6 +122,8 @@ static bool scale_u64_to_u64(
    return true;
}

// at least one known sanitize failure (see comment below)
ATTRIBUTE_NO_SANITIZE_INTEGER
static bool linear_transform_s64_to_s64(
        int64_t  val,
        int64_t  basis1,
@@ -172,7 +187,7 @@ static bool linear_transform_s64_to_s64(
        // (scaled_signbit XOR res_signbit)

        if (is_neg)
            scaled = -scaled;
            scaled = -scaled; // known sanitize failure
        res = scaled + basis2;

        if ((scaled ^ basis2 ^ INT64_MIN) & (scaled ^ res) & INT64_MIN)
@@ -250,6 +265,8 @@ template <class T> void LinearTransform::reduce(T* N, T* D) {
template void LinearTransform::reduce<uint64_t>(uint64_t* N, uint64_t* D);
template void LinearTransform::reduce<uint32_t>(uint32_t* N, uint32_t* D);

// sanitize failure if *N = 0x80000000
ATTRIBUTE_NO_SANITIZE_INTEGER
void LinearTransform::reduce(int32_t* N, uint32_t* D) {
    if (N && D && *D) {
        if (*N < 0) {