Есть следующий фрагмент кода
#include <iostream>
#include <type_traits>
thread_local std::aligned_storage_t<1024> data;
int main() {
std::cout << sizeof(data) << std::endl;
uint8_t * d = new (&data) uint8_t[1024];
d[1025] = '6';
std::cout << d[1025] << std::endl;
}
Sanitiser не обнаруживает переполнение буфера
Пример кода https://godbolt.org/z/r34f9jexj
ASAN должен быть инструментом специально для типов контейнеров. Например, в ASAN есть специальная реализация для std::vector: std::vector часто выделяет больше памяти, чем необходимо для хранения данных (см. .capacity()), а в ASAN есть код, позволяющий выяснить, что чтение/запись закончились. границы вектора. Я предполагаю, что у ASAN еще нет специального кода обработки для aligned_storage_t, поэтому, скорее всего, он не обнаружит ошибку в вашем случае.
@chris_se Насколько я понимаю, по умолчанию он должен поступать правильно. std::vector нуждается в ручном инструментировании только потому, что вы хотите перехватывать внешние доступы, которые не выходят за пределы возможностей (что по своей сути не является незаконным с точки зрения ASAN).





Похоже, очистка thread_local глобальных переменных еще не реализована https://github.com/google/sanitizers/issues/12
Вам не нужно новое размещение, оно воспроизводится в простом массиве: godbolt.org/z/Y5Pc3TKvT (как на Clang, так и на GCC). Интересно, что я также могу воспроизводить данные на нелокальном массиве (но только на GCC, Clang ловит это). Я бы сообщил об этом как об ошибке в ASAN.