1#ifndef INTERNAL_SANITIZERS_H
2#define INTERNAL_SANITIZERS_H
15#ifdef HAVE_VALGRIND_MEMCHECK_H
16# include <valgrind/memcheck.h>
19#ifdef HAVE_SANITIZER_ASAN_INTERFACE_H
20# include <sanitizer/asan_interface.h>
23#ifdef HAVE_SANITIZER_MSAN_INTERFACE_H
24# if __has_feature(memory_sanitizer)
25# include <sanitizer/msan_interface.h>
33#elif __has_feature(memory_sanitizer) && __has_feature(address_sanitizer)
34# define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS(x) \
35 __attribute__((__no_sanitize__("memory, address"), __noinline__)) x
36#elif __has_feature(address_sanitizer)
37# define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS(x) \
38 __attribute__((__no_sanitize__("address"), __noinline__)) x
39#elif defined(NO_SANITIZE_ADDRESS)
40# define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS(x) \
41 NO_SANITIZE_ADDRESS(NOINLINE(x))
42#elif defined(NO_ADDRESS_SAFETY_ANALYSIS)
43# define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS(x) \
44 NO_ADDRESS_SAFETY_ANALYSIS(NOINLINE(x))
46# define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS(x) x
49#if defined(NO_SANITIZE) && RBIMPL_COMPILER_IS(GCC)
53# define NO_SANITIZE(x, y) \
54 COMPILER_WARNING_PUSH; \
55 COMPILER_WARNING_IGNORED(-Wattributes); \
56 __attribute__((__no_sanitize__(x))) y; \
61# define NO_SANITIZE(x, y) y
64#if !__has_feature(address_sanitizer)
65# define __asan_poison_memory_region(x, y)
66# define __asan_unpoison_memory_region(x, y)
67# define __asan_region_is_poisoned(x, y) 0
70#if !__has_feature(memory_sanitizer)
71# define __msan_allocated_memory(x, y) ((void)(x), (void)(y))
72# define __msan_poison(x, y) ((void)(x), (void)(y))
73# define __msan_unpoison(x, y) ((void)(x), (void)(y))
74# define __msan_unpoison_string(x) ((void)(x))
77#ifdef VALGRIND_MAKE_READABLE
78# define VALGRIND_MAKE_MEM_DEFINED(p, n) VALGRIND_MAKE_READABLE((p), (n))
81#ifdef VALGRIND_MAKE_WRITABLE
82# define VALGRIND_MAKE_MEM_UNDEFINED(p, n) VALGRIND_MAKE_WRITABLE((p), (n))
85#ifndef VALGRIND_MAKE_MEM_DEFINED
86# define VALGRIND_MAKE_MEM_DEFINED(p, n) 0
89#ifndef VALGRIND_MAKE_MEM_UNDEFINED
90# define VALGRIND_MAKE_MEM_UNDEFINED(p, n) 0
109asan_poison_memory_region(
const volatile void *
ptr,
size_t size)
112 __asan_poison_memory_region(
ptr,
size);
121asan_poison_object(
VALUE obj)
127#if !__has_feature(address_sanitizer)
128#define asan_poison_object_if(ptr, obj) ((void)(ptr), (void)(obj))
130#define asan_poison_object_if(ptr, obj) do { \
131 if (ptr) asan_poison_object(obj); \
143asan_poisoned_object_p(
VALUE obj)
165asan_unpoison_memory_region(
const volatile void *
ptr,
size_t size,
bool malloc_p)
167 __asan_unpoison_memory_region(
ptr,
size);
169 __msan_allocated_memory(
ptr,
size);
183asan_unpoison_object(
VALUE obj,
bool newobj_p)
Internal header absorbing C compipler differences.
Thin wrapper to ruby/config.h.
Internal header to suppres / mandate warnings.