Уже принадлежащее значение указателя не должно храниться в несвязанном интеллектуальном указателе
Уже принадлежащее значение указателя не должно храниться в несвязанном интеллектуальном указателе.
Интеллектуальные указатели используются для обеспечения автоматического освобождения памяти, на которую указывает указатель, при его уничтожении, например, если указатель выходит из области действия. Когда несвязанные смарт-указатели управляют одним и тем же значением указателя, один из смарт-указателей может попытаться освободить память, которая уже была освобождена другим смарт-указателем. Это приводит к двойной свободной уязвимости, которая повреждает структуру данных управления памятью программы.
Значение указателя, используемое для инициализации указателя, принадлежит смарт-указателю. Если значение указателя уже принадлежит интеллектуальному указателю, например std::shared_ptrЗатем этот смарт-указатель используется для инициализации другого смарт-указателя, например, с помощью операции копирования, два смарт-указателя связаны. Базовым значением указателя управляют как смарт-указатели, так и память, на которую он указывает, не освобождается до тех пор, пока все смарт-указатели не будут уничтожены.
Polyspace ® помечает использование уже принадлежащего указателя в качестве аргумента:
Конструктор смарт-указателей. Например, в этом фрагменте кода raw_ptr уже принадлежит s_ptr1 и используется для инициализации s_ptr2:
char *raw_ptr = new char; std::shared_ptr<char> s_ptr1(raw_ptr); std::shared_ptr<char> s_ptr2(raw_ptr); //raw_ptr is already owned by s_ptr1
Операция сброса смарт-указателя. Например, в этом фрагменте кода сброс s_ptr2 заменяет raw_ptr2 с уже принадлежащими raw_ptr1:
char *raw_ptr1 = new char; char *raw_ptr2 = new char; std::shared_ptr<char> s_ptr1(raw_ptr1); std::shared_ptr<char> s_ptr2(raw_ptr2); s_ptr2.reset(raw_ptr1); // s_ptr2 releases raw_ptr2 and owns already owned raw_ptr1
Полиспейс проверяет только типы смарт-указателей std::shared_ptr и std::unique_ptr и считает, что пользовательские распределители и удалители имеют стандартное поведение распределения и освобождения.
Указатель уже принадлежит интеллектуальному указателю, если тип указателя не является std::nullptr_t и либо:
Указатель использовался для инициализации интеллектуального указателя.
Указатель использовался в качестве аргумента для интеллектуального указателя reset() функция-член.
Указатель является возвращаемым значением интеллектуального указателя get() функция-член.
Указатель является возвращаемым значением интеллектуального указателя operator-> функция-член.
Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Библиотека общих утилит |
| Категория: Обязательно, Автоматизировано |