[build] Include FPESAN in UBSAN.

TEST=ubsan
Bug: b/301044910
Change-Id: I608dd742a243bc1ab620c92da46e48270d6b060f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/327041
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Ben Konyi <bkonyi@google.com>
This commit is contained in:
Ryan Macnak 2023-09-21 15:16:39 +00:00 committed by Commit Queue
parent 2502e4e385
commit 8e6191c7f9
6 changed files with 46 additions and 19 deletions

View file

@ -133,8 +133,16 @@ config("compiler") {
ldflags += [ "-fsanitize=thread" ] ldflags += [ "-fsanitize=thread" ]
} }
if (is_ubsan) { if (is_ubsan) {
cflags += [ "-fsanitize=undefined" ] cflags += [
ldflags += [ "-fsanitize=undefined" ] "-fsanitize=undefined",
"-fsanitize=float-divide-by-zero",
"-fsanitize=float-cast-overflow",
]
ldflags += [
"-fsanitize=undefined",
"-fsanitize=float-divide-by-zero",
"-fsanitize=float-cast-overflow",
]
} }
if (use_custom_libcxx) { if (use_custom_libcxx) {

View file

@ -33,7 +33,11 @@ config("sanitizer_options_link_helper") {
ldflags += [ "-fsanitize=thread" ] ldflags += [ "-fsanitize=thread" ]
} }
if (is_ubsan) { if (is_ubsan) {
ldflags += [ "-fsanitize=undefined" ] ldflags += [
"-fsanitize=undefined",
"-fsanitize=float-divide-by-zero",
"-fsanitize=float-cast-overflow",
]
} }
} }

View file

@ -66,7 +66,7 @@ DEFINE_NATIVE_ENTRY(Double_div, 0, 2) {
if (FLAG_trace_intrinsified_natives) { if (FLAG_trace_intrinsified_natives) {
OS::PrintErr("Double_div %f / %f\n", left, right); OS::PrintErr("Double_div %f / %f\n", left, right);
} }
return Double::New(left / right); return Double::New(Utils::DivideAllowZero(left, right));
} }
DEFINE_NATIVE_ENTRY(Double_modulo, 0, 2) { DEFINE_NATIVE_ENTRY(Double_modulo, 0, 2) {

View file

@ -96,10 +96,10 @@ DEFINE_NATIVE_ENTRY(Float32x4_mul, 0, 2) {
DEFINE_NATIVE_ENTRY(Float32x4_div, 0, 2) { DEFINE_NATIVE_ENTRY(Float32x4_div, 0, 2) {
GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0)); GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, other, arguments->NativeArgAt(1)); GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, other, arguments->NativeArgAt(1));
float _x = self.x() / other.x(); float _x = Utils::DivideAllowZero(self.x(), other.x());
float _y = self.y() / other.y(); float _y = Utils::DivideAllowZero(self.y(), other.y());
float _z = self.z() / other.z(); float _z = Utils::DivideAllowZero(self.z(), other.z());
float _w = self.w() / other.w(); float _w = Utils::DivideAllowZero(self.w(), other.w());
return Float32x4::New(_x, _y, _z, _w); return Float32x4::New(_x, _y, _z, _w);
} }
@ -361,19 +361,19 @@ DEFINE_NATIVE_ENTRY(Float32x4_sqrt, 0, 1) {
DEFINE_NATIVE_ENTRY(Float32x4_reciprocal, 0, 1) { DEFINE_NATIVE_ENTRY(Float32x4_reciprocal, 0, 1) {
GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0)); GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
float _x = 1.0f / self.x(); float _x = Utils::DivideAllowZero(1.0f, self.x());
float _y = 1.0f / self.y(); float _y = Utils::DivideAllowZero(1.0f, self.y());
float _z = 1.0f / self.z(); float _z = Utils::DivideAllowZero(1.0f, self.z());
float _w = 1.0f / self.w(); float _w = Utils::DivideAllowZero(1.0f, self.w());
return Float32x4::New(_x, _y, _z, _w); return Float32x4::New(_x, _y, _z, _w);
} }
DEFINE_NATIVE_ENTRY(Float32x4_reciprocalSqrt, 0, 1) { DEFINE_NATIVE_ENTRY(Float32x4_reciprocalSqrt, 0, 1) {
GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0)); GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
float _x = sqrtf(1.0f / self.x()); float _x = sqrtf(Utils::DivideAllowZero(1.0f, self.x()));
float _y = sqrtf(1.0f / self.y()); float _y = sqrtf(Utils::DivideAllowZero(1.0f, self.y()));
float _z = sqrtf(1.0f / self.z()); float _z = sqrtf(Utils::DivideAllowZero(1.0f, self.z()));
float _w = sqrtf(1.0f / self.w()); float _w = sqrtf(Utils::DivideAllowZero(1.0f, self.w()));
return Float32x4::New(_x, _y, _z, _w); return Float32x4::New(_x, _y, _z, _w);
} }
@ -710,8 +710,8 @@ DEFINE_NATIVE_ENTRY(Float64x2_mul, 0, 2) {
DEFINE_NATIVE_ENTRY(Float64x2_div, 0, 2) { DEFINE_NATIVE_ENTRY(Float64x2_div, 0, 2) {
GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0)); GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other, arguments->NativeArgAt(1)); GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other, arguments->NativeArgAt(1));
double _x = self.x() / other.x(); double _x = Utils::DivideAllowZero(self.x(), other.x());
double _y = self.y() / other.y(); double _y = Utils::DivideAllowZero(self.y(), other.y());
return Float64x2::New(_x, _y); return Float64x2::New(_x, _y);
} }

View file

@ -474,6 +474,21 @@ class Utils {
(static_cast<Unsigned>(value) << ((width - rotate) & (width - 1))); (static_cast<Unsigned>(value) << ((width - rotate) & (width - 1)));
} }
#ifdef __GNUC__
__attribute__((no_sanitize("float-divide-by-zero")))
#endif
static inline float
DivideAllowZero(float a, float b) {
return a / b;
}
#ifdef __GNUC__
__attribute__((no_sanitize("float-divide-by-zero")))
#endif
static inline double
DivideAllowZero(double a, double b) {
return a / b;
}
// Utility functions for converting values from host endianness to // Utility functions for converting values from host endianness to
// big or little endian values. // big or little endian values.
static uint16_t HostToBigEndian16(uint16_t host_value); static uint16_t HostToBigEndian16(uint16_t host_value);

View file

@ -200,7 +200,7 @@ double Evaluator::EvaluateDoubleOp(const double left,
case Token::kMUL: case Token::kMUL:
return left * right; return left * right;
case Token::kDIV: case Token::kDIV:
return left / right; return Utils::DivideAllowZero(left, right);
default: default:
UNREACHABLE(); UNREACHABLE();
} }