Ручное отравление 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 по-прежнему имеет его по умолчанию по непонятным причинам.

Другие вопросы по тегам