[vm] Fix using GCC with the sanitizers.

TEST=local
Change-Id: Icb47e2c68e55ae14f806cb421b8d860cda4d1f1c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/350647
Reviewed-by: Alexander Aprelev <aam@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
This commit is contained in:
Ryan Macnak 2024-02-21 20:15:15 +00:00 committed by Commit Queue
parent 233de26ab4
commit d67f159332
14 changed files with 32 additions and 48 deletions

View file

@ -216,13 +216,7 @@ if (current_os == "win") {
# BUILD OPTIONS
# =============================================================================
# These Sanitizers all imply using the Clang compiler. On Windows they either
# don't work or work differently.
if (!is_clang && (is_asan || is_lsan || is_msan || is_tsan || is_ubsan)) {
is_clang = true
}
use_flutter_cxx = is_msan || is_tsan
use_flutter_cxx = is_clang && (is_msan || is_tsan)
# =============================================================================
# TARGET DEFAULTS

View file

@ -113,9 +113,6 @@ config("compiler") {
# Common options for AddressSanitizer, LeakSanitizer, ThreadSanitizer and
# MemorySanitizer
if (using_sanitizer) {
cflags += [ "-gline-tables-only" ]
}
if (is_asan) {
cflags += [ "-fsanitize=address" ]
ldflags += [ "-fsanitize=address" ]

View file

@ -19,14 +19,14 @@ namespace embedder {
static char* MallocFormatedString(const char* format, ...) {
va_list measure_args;
va_start(measure_args, format);
intptr_t len = vsnprintf(nullptr, 0, format, measure_args);
intptr_t len = Utils::VSNPrint(nullptr, 0, format, measure_args);
va_end(measure_args);
char* buffer = reinterpret_cast<char*>(malloc(len + 1));
MSAN_UNPOISON(buffer, (len + 1));
va_list print_args;
va_start(print_args, format);
vsnprintf(buffer, (len + 1), format, print_args);
Utils::VSNPrint(buffer, (len + 1), format, print_args);
va_end(print_args);
return buffer;
}

View file

@ -774,14 +774,14 @@ Dart_Handle DartUtils::NewDartIOException(const char* exception_name,
Dart_Handle DartUtils::NewError(const char* format, ...) {
va_list measure_args;
va_start(measure_args, format);
intptr_t len = vsnprintf(nullptr, 0, format, measure_args);
intptr_t len = Utils::VSNPrint(nullptr, 0, format, measure_args);
va_end(measure_args);
char* buffer = reinterpret_cast<char*>(Dart_ScopeAllocate(len + 1));
MSAN_UNPOISON(buffer, (len + 1));
va_list print_args;
va_start(print_args, format);
vsnprintf(buffer, (len + 1), format, print_args);
Utils::VSNPrint(buffer, (len + 1), format, print_args);
va_end(print_args);
return Dart_NewApiError(buffer);
@ -802,7 +802,7 @@ Dart_Handle DartUtils::NewStringFormatted(const char* format, ...) {
char* DartUtils::ScopedCStringVFormatted(const char* format, va_list args) {
va_list measure_args;
va_copy(measure_args, args);
intptr_t len = vsnprintf(nullptr, 0, format, measure_args);
intptr_t len = Utils::VSNPrint(nullptr, 0, format, measure_args);
if (len < 0) {
return nullptr;
}
@ -812,7 +812,7 @@ char* DartUtils::ScopedCStringVFormatted(const char* format, va_list args) {
MSAN_UNPOISON(buffer, (len + 1));
va_list print_args;
va_copy(print_args, args);
len = vsnprintf(buffer, (len + 1), format, print_args);
len = Utils::VSNPrint(buffer, (len + 1), format, print_args);
if (len < 0) {
return nullptr;
}

View file

@ -132,7 +132,7 @@ bool File::VPrint(const char* format, va_list args) {
// Measure.
va_list measure_args;
va_copy(measure_args, args);
intptr_t len = vsnprintf(nullptr, 0, format, measure_args);
intptr_t len = Utils::VSNPrint(nullptr, 0, format, measure_args);
va_end(measure_args);
char* buffer = reinterpret_cast<char*>(malloc(len + 1));
@ -140,7 +140,7 @@ bool File::VPrint(const char* format, va_list args) {
// Print.
va_list print_args;
va_copy(print_args, args);
vsnprintf(buffer, len + 1, format, print_args);
Utils::VSNPrint(buffer, len + 1, format, print_args);
va_end(print_args);
bool result = WriteFully(buffer, len);

View file

@ -143,7 +143,7 @@ bool File::VPrint(const char* format, va_list args) {
// Measure.
va_list measure_args;
va_copy(measure_args, args);
intptr_t len = vsnprintf(nullptr, 0, format, measure_args);
intptr_t len = Utils::VSNPrint(nullptr, 0, format, measure_args);
va_end(measure_args);
char* buffer = reinterpret_cast<char*>(malloc(len + 1));
@ -151,7 +151,7 @@ bool File::VPrint(const char* format, va_list args) {
// Print.
va_list print_args;
va_copy(print_args, args);
vsnprintf(buffer, len + 1, format, print_args);
Utils::VSNPrint(buffer, len + 1, format, print_args);
va_end(print_args);
bool result = WriteFully(buffer, len);

View file

@ -175,7 +175,7 @@ bool File::VPrint(const char* format, va_list args) {
// Measure.
va_list measure_args;
va_copy(measure_args, args);
intptr_t len = vsnprintf(nullptr, 0, format, measure_args);
intptr_t len = Utils::VSNPrint(nullptr, 0, format, measure_args);
va_end(measure_args);
char* buffer = reinterpret_cast<char*>(malloc(len + 1));
@ -183,7 +183,7 @@ bool File::VPrint(const char* format, va_list args) {
// Print.
va_list print_args;
va_copy(print_args, args);
vsnprintf(buffer, len + 1, format, print_args);
Utils::VSNPrint(buffer, len + 1, format, print_args);
va_end(print_args);
bool result = WriteFully(buffer, len);

View file

@ -9,7 +9,9 @@
// Allow the use of ASan (AddressSanitizer). This is needed as ASan needs to be
// told about areas where the VM does the equivalent of a long-jump.
#if defined(__has_feature)
#if __SANITIZE_ADDRESS__
#define USING_ADDRESS_SANITIZER
#elif defined(__has_feature)
#if __has_feature(address_sanitizer)
#define USING_ADDRESS_SANITIZER
#endif

View file

@ -122,7 +122,7 @@ class AcqRelAtomic {
T& expected, // NOLINT
T desired,
std::memory_order success_order = std::memory_order_acq_rel,
std::memory_order failure_order = std::memory_order_seq_cst) {
std::memory_order failure_order = std::memory_order_acquire) {
return value_.compare_exchange_weak(expected, desired, success_order,
failure_order);
}
@ -130,7 +130,7 @@ class AcqRelAtomic {
T& expected, // NOLINT
T desired,
std::memory_order success_order = std::memory_order_acq_rel,
std::memory_order failure_order = std::memory_order_seq_cst) {
std::memory_order failure_order = std::memory_order_acquire) {
return value_.compare_exchange_strong(expected, desired, success_order,
failure_order);
}

View file

@ -7,7 +7,9 @@
#include "platform/globals.h"
#if defined(__has_feature)
#if __SANITIZE_ADDRESS__
#define USING_LEAK_SANITIZER
#elif defined(__has_feature)
#if __has_feature(leak_sanitizer) || __has_feature(address_sanitizer)
#define USING_LEAK_SANITIZER
#endif

View file

@ -7,7 +7,9 @@
#include "platform/globals.h"
#if defined(__has_feature)
#if __SANITIZE_THREAD__
#define USING_THREAD_SANITIZER
#elif defined(__has_feature)
#if __has_feature(thread_sanitizer)
#define USING_THREAD_SANITIZER
#endif

View file

@ -10,33 +10,19 @@
namespace dart {
#if defined(HOST_ARCH_ARM) || defined(HOST_ARCH_ARM64)
template <typename T>
static inline T LoadUnaligned(const T* ptr) {
T value;
memcpy(reinterpret_cast<void*>(&value), reinterpret_cast<const void*>(ptr),
sizeof(value));
memcpy(reinterpret_cast<void*>(&value), // NOLINT
reinterpret_cast<const void*>(ptr), sizeof(value));
return value;
}
template <typename T>
static inline void StoreUnaligned(T* ptr, T value) {
memcpy(reinterpret_cast<void*>(ptr), reinterpret_cast<const void*>(&value),
sizeof(value));
memcpy(reinterpret_cast<void*>(ptr), // NOLINT
reinterpret_cast<const void*>(&value), sizeof(value));
}
#else // !(HOST_ARCH_ARM || HOST_ARCH_ARM64)
template <typename T>
NO_SANITIZE_UNDEFINED("alignment")
static inline T LoadUnaligned(const T* ptr) {
return *ptr;
}
template <typename T>
NO_SANITIZE_UNDEFINED("alignment")
static inline void StoreUnaligned(T* ptr, T value) {
*ptr = value;
}
#endif // !(HOST_ARCH_ARM || HOST_ARCH_ARM64)
} // namespace dart

View file

@ -5,7 +5,9 @@
#ifndef RUNTIME_PLATFORM_UNDEFINED_BEHAVIOR_SANITIZER_H_
#define RUNTIME_PLATFORM_UNDEFINED_BEHAVIOR_SANITIZER_H_
#if defined(__has_feature)
#if __SANITIZE_UNDEFINED__
#define USING_UNDEFINED_BEHAVIOR_SANITIZER
#elif defined(__has_feature)
#if __has_feature(undefined_behavior_sanitizer)
#define USING_UNDEFINED_BEHAVIOR_SANITIZER
#endif

View file

@ -113,8 +113,6 @@ DART_EXPORT bool Dart_CloseNativePort(Dart_Port native_port_id) {
return was_closed;
}
static Monitor* vm_service_calls_monitor = new Monitor();
DART_EXPORT bool Dart_InvokeVMServiceMethod(uint8_t* request_json,
intptr_t request_json_length,
uint8_t** response_json,
@ -133,6 +131,7 @@ DART_EXPORT bool Dart_InvokeVMServiceMethod(uint8_t* request_json,
// We only allow one isolate reload at a time. If this turns out to be on the
// critical path, we can change it to have a global datastructure which is
// mapping the reply ports to receive buffers.
static Monitor* vm_service_calls_monitor = new Monitor();
MonitorLocker _(vm_service_calls_monitor);
static Monitor* vm_service_call_monitor = new Monitor();