Path: blob/main/contrib/llvm-project/compiler-rt/lib/msan/msan_interface_internal.h
35262 views
//===-- msan_interface_internal.h -------------------------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file is a part of MemorySanitizer.9//10// Private MSan interface header.11//===----------------------------------------------------------------------===//1213#ifndef MSAN_INTERFACE_INTERNAL_H14#define MSAN_INTERFACE_INTERNAL_H1516#include "sanitizer_common/sanitizer_internal_defs.h"1718extern "C" {19// FIXME: document all interface functions.2021SANITIZER_INTERFACE_ATTRIBUTE22int __msan_get_track_origins();2324SANITIZER_INTERFACE_ATTRIBUTE25void __msan_init();2627// Print a warning and maybe return.28// This function can die based on common_flags()->exitcode.29SANITIZER_INTERFACE_ATTRIBUTE30void __msan_warning();3132// Print a warning and die.33// Instrumentation inserts calls to this function when building in "fast" mode34// (i.e. -mllvm -msan-keep-going)35SANITIZER_INTERFACE_ATTRIBUTE __attribute__((noreturn))36void __msan_warning_noreturn();3738using __sanitizer::uptr;39using __sanitizer::sptr;40using __sanitizer::uu64;41using __sanitizer::uu32;42using __sanitizer::uu16;43using __sanitizer::u64;44using __sanitizer::u32;45using __sanitizer::u16;46using __sanitizer::u8;4748// Versions of the above which take Origin as a parameter49SANITIZER_INTERFACE_ATTRIBUTE50void __msan_warning_with_origin(u32 origin);51SANITIZER_INTERFACE_ATTRIBUTE __attribute__((noreturn)) void52__msan_warning_with_origin_noreturn(u32 origin);5354SANITIZER_INTERFACE_ATTRIBUTE55void __msan_maybe_warning_1(u8 s, u32 o);56SANITIZER_INTERFACE_ATTRIBUTE57void __msan_maybe_warning_2(u16 s, u32 o);58SANITIZER_INTERFACE_ATTRIBUTE59void __msan_maybe_warning_4(u32 s, u32 o);60SANITIZER_INTERFACE_ATTRIBUTE61void __msan_maybe_warning_8(u64 s, u32 o);6263SANITIZER_INTERFACE_ATTRIBUTE64void __msan_maybe_store_origin_1(u8 s, void *p, u32 o);65SANITIZER_INTERFACE_ATTRIBUTE66void __msan_maybe_store_origin_2(u16 s, void *p, u32 o);67SANITIZER_INTERFACE_ATTRIBUTE68void __msan_maybe_store_origin_4(u32 s, void *p, u32 o);69SANITIZER_INTERFACE_ATTRIBUTE70void __msan_maybe_store_origin_8(u64 s, void *p, u32 o);7172SANITIZER_INTERFACE_ATTRIBUTE73void __msan_unpoison(const void *a, uptr size);74SANITIZER_INTERFACE_ATTRIBUTE75void __msan_unpoison_string(const char *s);76SANITIZER_INTERFACE_ATTRIBUTE77void __msan_unpoison_param(uptr n);78SANITIZER_INTERFACE_ATTRIBUTE79void __msan_clear_and_unpoison(void *a, uptr size);80SANITIZER_INTERFACE_ATTRIBUTE81void* __msan_memcpy(void *dst, const void *src, uptr size);82SANITIZER_INTERFACE_ATTRIBUTE83void* __msan_memset(void *s, int c, uptr n);84SANITIZER_INTERFACE_ATTRIBUTE85void* __msan_memmove(void* dest, const void* src, uptr n);86SANITIZER_INTERFACE_ATTRIBUTE87void __msan_poison(const void *a, uptr size);88SANITIZER_INTERFACE_ATTRIBUTE89void __msan_poison_stack(void *a, uptr size);9091// Copy size bytes from src to dst and unpoison the result.92// Useful to implement unsafe loads.93SANITIZER_INTERFACE_ATTRIBUTE94void __msan_load_unpoisoned(void *src, uptr size, void *dst);9596// Returns the offset of the first (at least partially) poisoned byte,97// or -1 if the whole range is good.98SANITIZER_INTERFACE_ATTRIBUTE99sptr __msan_test_shadow(const void *x, uptr size);100101SANITIZER_INTERFACE_ATTRIBUTE102void __msan_check_mem_is_initialized(const void *x, uptr size);103104SANITIZER_INTERFACE_ATTRIBUTE105void __msan_set_origin(const void *a, uptr size, u32 origin);106SANITIZER_INTERFACE_ATTRIBUTE107void __msan_set_alloca_origin(void *a, uptr size, char *descr);108SANITIZER_INTERFACE_ATTRIBUTE109void __msan_set_alloca_origin4(void *a, uptr size, char *descr, uptr pc);110SANITIZER_INTERFACE_ATTRIBUTE111void __msan_set_alloca_origin_with_descr(void *a, uptr size, u32 *id_ptr,112char *descr);113SANITIZER_INTERFACE_ATTRIBUTE114void __msan_set_alloca_origin_no_descr(void *a, uptr size, u32 *id_ptr);115SANITIZER_INTERFACE_ATTRIBUTE116u32 __msan_chain_origin(u32 id);117SANITIZER_INTERFACE_ATTRIBUTE118u32 __msan_get_origin(const void *a);119120// Test that this_id is a descendant of prev_id (or they are simply equal).121// "descendant" here means that are part of the same chain, created with122// __msan_chain_origin.123SANITIZER_INTERFACE_ATTRIBUTE124int __msan_origin_is_descendant_or_same(u32 this_id, u32 prev_id);125126127SANITIZER_INTERFACE_ATTRIBUTE128void __msan_clear_on_return();129130SANITIZER_INTERFACE_ATTRIBUTE131void __msan_set_keep_going(int keep_going);132133SANITIZER_INTERFACE_ATTRIBUTE134int __msan_set_poison_in_malloc(int do_poison);135136SANITIZER_INTERFACE_ATTRIBUTE137const char *__msan_default_options();138139// For testing.140SANITIZER_INTERFACE_ATTRIBUTE141void __msan_set_expect_umr(int expect_umr);142SANITIZER_INTERFACE_ATTRIBUTE143void __msan_print_shadow(const void *x, uptr size);144SANITIZER_INTERFACE_ATTRIBUTE145void __msan_dump_shadow(const void *x, uptr size);146SANITIZER_INTERFACE_ATTRIBUTE147int __msan_has_dynamic_component();148149// For testing.150SANITIZER_INTERFACE_ATTRIBUTE151u32 __msan_get_umr_origin();152SANITIZER_INTERFACE_ATTRIBUTE153void __msan_partial_poison(const void* data, void* shadow, uptr size);154155// Tell MSan about newly allocated memory (ex.: custom allocator).156// Memory will be marked uninitialized, with origin at the call site.157SANITIZER_INTERFACE_ATTRIBUTE158void __msan_allocated_memory(const void* data, uptr size);159160// Tell MSan about newly destroyed memory. Memory will be marked161// uninitialized.162SANITIZER_INTERFACE_ATTRIBUTE163void __sanitizer_dtor_callback(const void* data, uptr size);164SANITIZER_INTERFACE_ATTRIBUTE165void __sanitizer_dtor_callback_fields(const void *data, uptr size);166SANITIZER_INTERFACE_ATTRIBUTE167void __sanitizer_dtor_callback_vptr(const void *data);168169SANITIZER_INTERFACE_ATTRIBUTE170u16 __sanitizer_unaligned_load16(const uu16 *p);171172SANITIZER_INTERFACE_ATTRIBUTE173u32 __sanitizer_unaligned_load32(const uu32 *p);174175SANITIZER_INTERFACE_ATTRIBUTE176u64 __sanitizer_unaligned_load64(const uu64 *p);177178SANITIZER_INTERFACE_ATTRIBUTE179void __sanitizer_unaligned_store16(uu16 *p, u16 x);180181SANITIZER_INTERFACE_ATTRIBUTE182void __sanitizer_unaligned_store32(uu32 *p, u32 x);183184SANITIZER_INTERFACE_ATTRIBUTE185void __sanitizer_unaligned_store64(uu64 *p, u64 x);186187SANITIZER_INTERFACE_ATTRIBUTE188void __msan_set_death_callback(void (*callback)(void));189190SANITIZER_INTERFACE_ATTRIBUTE191void __msan_copy_shadow(void *dst, const void *src, uptr size);192193SANITIZER_INTERFACE_ATTRIBUTE194void __msan_scoped_disable_interceptor_checks();195196SANITIZER_INTERFACE_ATTRIBUTE197void __msan_scoped_enable_interceptor_checks();198199SANITIZER_INTERFACE_ATTRIBUTE200void __msan_start_switch_fiber(const void *bottom, uptr size);201202SANITIZER_INTERFACE_ATTRIBUTE203void __msan_finish_switch_fiber(const void **bottom_old, uptr *size_old);204} // extern "C"205206#endif // MSAN_INTERFACE_INTERNAL_H207208209