summaryrefslogtreecommitdiff
path: root/libcxx/include
diff options
context:
space:
mode:
authorAdvenam Tacet <advenam.tacet@trailofbits.com>2023-05-04 14:16:06 -0700
committerNikolas Klauser <n_klauser@apple.com>2023-05-04 14:17:25 -0700
commit2fa1bec7a20bb23f2e6620085adb257dafaa3be0 (patch)
treefd8e343731fca6d078149b3a967d7fc1ff7aa1e0 /libcxx/include
parentbfbe137888151dfd506df6b3319d08c4de0e00f5 (diff)
downloadllvm-2fa1bec7a20bb23f2e6620085adb257dafaa3be0.tar.gz
[ASan][libcxx] A way to turn off annotations for containers with a specific allocator
This revision is part of our efforts to support container annotations with (almost) every allocator. That patch is necessary to enable support for most annotations (D136765). Without a way to turn off annotations, it's hard to use ASan with area allocators (no calls to destructors). This is an answer to a request about it. This patch provides a solution to the aforementioned issue by introducing a new template structure `__asan_annotate_container_with_allocator`, which allows the disabling of container annotations for a specific allocator. This patch also introduces `_LIBCPP_HAS_ASAN_CONTAINER_ANNOTATIONS_FOR_ALL_ALLOCATORS` FTM. To turn off annotations, it is sufficient to create a template specialization with a false value using a [Unary Type Trait](https://en.cppreference.com/w/cpp/types/integral_constant). The proposed structure is being used in the code enabling annotations for all allocators in `std::vector`, `std::basic_string`, and `std::deque`. (D136765 D146214 D146815) Possibility to do it was added to ASan API in rGdd1b7b797a116eed588fd752fbe61d34deeb24e4 commit. For context on not calling a destructor, look at https://eel.is/c++draft/basic.life#5 and notes there, you may also read a discussion in D136765. Reviewed By: ldionne, philnik, #libc, hans Spies: EricWF, mikhail.ramalho, #sanitizers, libcxx-commits, hans, vitalybuka Differential Revision: https://reviews.llvm.org/D145628
Diffstat (limited to 'libcxx/include')
-rw-r--r--libcxx/include/__memory/allocator_traits.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/libcxx/include/__memory/allocator_traits.h b/libcxx/include/__memory/allocator_traits.h
index 57f88a38151f..4ed44165f916 100644
--- a/libcxx/include/__memory/allocator_traits.h
+++ b/libcxx/include/__memory/allocator_traits.h
@@ -401,6 +401,25 @@ struct __is_cpp17_copy_insertable<_Alloc, __enable_if_t<
: __is_cpp17_move_insertable<_Alloc>
{ };
+// ASan choices
+#ifndef _LIBCPP_HAS_NO_ASAN
+# define _LIBCPP_HAS_ASAN_CONTAINER_ANNOTATIONS_FOR_ALL_ALLOCATORS 1
+#endif
+
+#ifdef _LIBCPP_HAS_ASAN_CONTAINER_ANNOTATIONS_FOR_ALL_ALLOCATORS
+template <class _Alloc>
+struct __asan_annotate_container_with_allocator
+# if defined(_LIBCPP_CLANG_VER) && _LIBCPP_CLANG_VER >= 1600
+ : true_type {};
+# else
+ // TODO LLVM18: Remove the special-casing
+ : false_type {};
+# endif
+
+template <class _Tp>
+struct __asan_annotate_container_with_allocator<allocator<_Tp> > : true_type {};
+#endif
+
#undef _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX
_LIBCPP_END_NAMESPACE_STD