Уже принадлежащее значение указателя не должно храниться в несвязанном интеллектуальном указателе
Уже имеющееся значение указателя не должно храниться в несвязанном интеллектуальном указателе.
Вы используете смарт-указатели, чтобы убедиться, что память, на которую указывает указатель, автоматически отменяется при уничтожении указателя, например, если указатель выходит из возможностей. Когда несвязанные смарт-указатели управляют тем же значением указателя, один из смарт-указателей может попытаться удалить память, которая уже была отключена другим смарт-указателем. Это приводит к двойной свободной уязвимости, которая повреждает структуру данных управления памятью вашей программы.
Интеллектуальному указателю принадлежит значение указателя, которое используется для инициализации интеллектуального указателя. Если значение указателя уже принадлежит смарт-указателю, такому как 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
Polyspace проверяет только типы смарт-указателей std::shared_ptr
и std::unique_ptr
и считает, что определяемые пользователем распределители и разделители имеют стандартное поведение выделения и удаления.
Указатель уже принадлежит смарт-указателю, если тип указателя не std::nullptr_t
и либо:
Указатель использовался для инициализации смарт-указателя.
Указатель использовался как аргумент для смарт-указателя reset()
функции представителя.
Указатель является возвратом значением интеллектуального указателя get()
функции представителя.
Указатель является возвратом значением интеллектуального указателя operator->
функции представителя.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
Группа: Библиотека общих утилит |
Категория: Необходимый, Автоматизированный |