exponenta event banner

Правило AUTOSAR C++ 14 A18-1-3

Использование std::auto_ptr не допускается

Описание

Определение правила

Использование std::auto_ptr не допускается.

Объяснение

std::auto_ptr - тип шаблона класса, предшествующий введению семантики перемещения в стандарт языка C++ 11. При копировании источникаstd::auto_ptr в целевой объект, исходный объект изменяется. Компилятор передает право собственности на ресурсы в исходном объекте целевому объекту и устанавливает исходный объект в нуль-указатель. Из-за этого необычного синтаксиса копирования использование исходного объекта после операции копирования может привести к непредвиденному поведению. Рассмотрим этот фрагмент кода, где использование std::auto_ptr приводит к сбою сегментации.

void func(auto_ptr<int> p) {
	cout<<*p;
	//...
}

int main()
{
	std::auto_ptr<int> s = new int(1);
	//..
	func(s); // This call makes s a null-pointer
	//...
	func(s); // exception, because s is null
	return 1;
}

Первый вызов func() копирует источник std::auto_ptr объект s к аргументу p, передает право собственности указателя на p, и наборы s к нулевому указателю. Когда func() вызывается повторно, компилятор пытается получить доступ к нулевому указателю s, что приводит к сбою сегментации.

std::auto_ptr объекты типа также несовместимы с любым универсальным кодом, который ожидает, что операция копирования не приведет к недействительности исходного объекта, например библиотеки стандартных шаблонов (STL). Избегайте использования std::auto_ptr. Он устаревает в C++ 11 и удаляется из C++ 17. Стандарт языка C++ 11 представляетstd::unique_ptr как более безопасная замена для std::auto_ptr. Использовать std::unique_ptr вместо std::auto_ptr.

Внедрение Polyspace

Polyspace ® помечает все экземпляры std::auto_ptr в коде, отличном от массивов стиля C.

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

развернуть все

Этот код показывает, как флаги Polyspace std::auto_ptr в вашем коде.

#include <cstdint>
#include <memory>
#include <vector>
#define AUTOPTROF(_TYPE) std::auto_ptr<_TYPE>
AUTOPTROF(int) v_int;                           // Noncompliant
typedef struct {
	std::auto_ptr<bool> vb;                     // Noncompliant
} T;
T vec; 
typedef std::auto_ptr<int> my_int_auto_ptr;     // Noncompliant
void Fn() noexcept
{
      
	std::auto_ptr<std::int32_t> ptr1(new std::int32_t(10)); // Noncompliant
	std::unique_ptr<std::int32_t> ptr2 =
	std::make_unique<std::int32_t>(10);         // Compliant
	std::vector<std::auto_ptr<std::int32_t>> v;  // Noncompliant
}

int main(){
	//..
}

Polyspace помечает std::auto_ptr объекты. Использовать std::unique_ptr вместо std::auto_ptr.

Проверить информацию

Группа: Библиотека поддержки языка
Категория: Обязательно, Автоматизировано
Представлен в R2020a