| // Copyright 2020 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef V8_HEAP_CPPGC_SANITIZERS_H_ |
| #define V8_HEAP_CPPGC_SANITIZERS_H_ |
| |
| #include <stdint.h> |
| #include <string.h> |
| |
| #include "src/base/macros.h" |
| |
| // |
| // TODO(chromium:1056170): Find a place in base for sanitizer support. |
| // |
| |
| #ifdef V8_USE_ADDRESS_SANITIZER |
| |
| #include <sanitizer/asan_interface.h> |
| |
| #define NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) |
| #if !defined(ASAN_POISON_MEMORY_REGION) || !defined(ASAN_UNPOISON_MEMORY_REGION) |
| #error "ASAN_POISON_MEMORY_REGION must be defined" |
| #endif |
| |
| #else // !V8_USE_ADDRESS_SANITIZER |
| |
| #define NO_SANITIZE_ADDRESS |
| #define ASAN_POISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size)) |
| #define ASAN_UNPOISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size)) |
| |
| #endif // V8_USE_ADDRESS_SANITIZER |
| |
| #ifdef V8_USE_MEMORY_SANITIZER |
| |
| #include <sanitizer/msan_interface.h> |
| |
| #define MSAN_POISON(addr, size) __msan_allocated_memory(addr, size) |
| #define MSAN_UNPOISON(addr, size) __msan_unpoison(addr, size) |
| |
| #else // !V8_USE_MEMORY_SANITIZER |
| |
| #define MSAN_POISON(addr, size) ((void)(addr), (void)(size)) |
| #define MSAN_UNPOISON(addr, size) ((void)(addr), (void)(size)) |
| |
| #endif // V8_USE_MEMORY_SANITIZER |
| |
| // API for newly allocated or reclaimed memory. |
| #if defined(V8_USE_MEMORY_SANITIZER) |
| #define SET_MEMORY_ACCESSIBLE(address, size) MSAN_UNPOISON(address, size); |
| #define SET_MEMORY_INACCESSIBLE(address, size) \ |
| memset((address), 0, (size)); \ |
| MSAN_POISON((address), (size)) |
| #elif defined(V8_USE_ADDRESS_SANITIZER) |
| #define SET_MEMORY_ACCESSIBLE(address, size) \ |
| ASAN_UNPOISON_MEMORY_REGION(address, size); |
| #define SET_MEMORY_INACCESSIBLE(address, size) \ |
| memset((address), 0, (size)); \ |
| ASAN_POISON_MEMORY_REGION(address, size) |
| #elif DEBUG |
| #define SET_MEMORY_ACCESSIBLE(address, size) memset((address), 0, (size)) |
| #define SET_MEMORY_INACCESSIBLE(address, size) \ |
| ::cppgc::internal::ZapMemory((address), (size)); |
| #else |
| #define SET_MEMORY_ACCESSIBLE(address, size) ((void)(address), (void)(size)) |
| #define SET_MEMORY_INACCESSIBLE(address, size) memset((address), 0, (size)) |
| #endif |
| |
| namespace cppgc { |
| namespace internal { |
| |
| inline void ZapMemory(void* address, size_t size) { |
| // The lowest bit of the zapped value should be 0 so that zapped object |
| // are never viewed as fully constructed objects. |
| static constexpr uint8_t kZappedValue = 0xdc; |
| memset(address, kZappedValue, size); |
| } |
| |
| } // namespace internal |
| } // namespace cppgc |
| |
| #endif // V8_HEAP_CPPGC_SANITIZERS_H_ |