Ручное отравление 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)

4

Решение

Это было реализовано в Clang (libc ++) и относительно недавних GNU (libstdc ++) STL (см. Асан вики для деталей).

Одна из проблем, связанных с этой функцией, заключается в том, что она нарушает раздельную очистку, то есть способность очищать только части вашего приложения (например, только исполняемый файл, а не библиотеки). Проблема заключается в том, что если вектор помещается в неанитизированный и извлекается в очищенном коде, то программа-толкач не будет знать, что ему нужно отменить удаление буфера. По этой причине он отключен по умолчанию в GCC (определите _GLIBCXX_SANITIZE_VECTOR чтобы включить его), Clang по-прежнему имеет его по умолчанию по непонятным причинам.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]