Ручное отравление std::vector
В следующем фрагменте кода есть ошибка, которая не является тривиальной, но я бы ожидал, что такие инструменты, как 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)
1 ответ
Это было реализовано в Clang (libC++) и относительно недавних STL GNU (libstdC++) (подробности см. В вики Asan).
Одна из проблем этой функции заключается в том, что она нарушает отдельную санитарную обработку, т. Е. Способность очищать только части вашего приложения (например, только исполняемый файл, а не библиотеки). Проблема заключается в том, что если вектор помещается в неанитизированный и извлекается в очищенном коде, то программа-толкач не будет знать, что ему нужно отменить удаление буфера. По этой причине он отключен по умолчанию в GCC (определите _GLIBCXX_SANITIZE_VECTOR
чтобы включить его), Clang по-прежнему имеет его по умолчанию по непонятным причинам.