В следующем фрагменте кода есть ошибка, которая не является тривиальной, но я бы ожидал, что такие инструменты, как AddressSanitizer, смогут ее перехватить.
#include <vector>
#include <iostream>
int main ()
{
std::vector<int> toto;
toto.push_back(2);
int const& titi = toto[0];
toto.pop_back();
std::cout << titi << std::endl;
return 1;
}
При извлечении вектора и печати за пределами области видимости в ссылке catch выдается ошибка use-heap-after-free.
Но когда нет возможности, std::vector
реализация, вероятно, не освободит память после pop_back, поэтому ссылка все еще указывает на действительный объем памяти.
У меня есть поиск вокруг, и я обнаружил, что вы можете вручную отравить память, и мне было интересно, если это было реализовано в STL (https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning)
Это было реализовано в Clang (libc ++) и относительно недавних GNU (libstdc ++) STL (см. Асан вики для деталей).
Одна из проблем, связанных с этой функцией, заключается в том, что она нарушает раздельную очистку, то есть способность очищать только части вашего приложения (например, только исполняемый файл, а не библиотеки). Проблема заключается в том, что если вектор помещается в неанитизированный и извлекается в очищенном коде, то программа-толкач не будет знать, что ему нужно отменить удаление буфера. По этой причине он отключен по умолчанию в GCC (определите _GLIBCXX_SANITIZE_VECTOR
чтобы включить его), Clang по-прежнему имеет его по умолчанию по непонятным причинам.
Других решений пока нет …