Уже принадлежавшее значение указателя не должно храниться в несвязанном интеллектуальном указателе
Уже принадлежавшее значение указателя не должно храниться в несвязанном интеллектуальном указателе.
Вы используете интеллектуальные указатели, чтобы гарантировать, что память, на которую указывает указатель, автоматически освобождена, когда указатель уничтожается, например, если указатель выходит из осциллографа. Когда несвязанные интеллектуальные указатели управляют тем же значением указателя, один из интеллектуальных указателей может попытаться освободить память, которая была уже освобождена другим интеллектуальным указателем. Это приводит к двойной свободной уязвимости, которая повреждает структуру данных управления памятью вашей программы.
Интеллектуальный указатель владеет значением указателя, которое используется, чтобы инициализировать интеллектуальный указатель. Если значение указателя уже принадлежит интеллектуальному указателю, такому как 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->
функция членства.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: Общая сервисная библиотека |
Категория: необходимый, автоматизированный |