AUTOSAR C++14 Rule A18-1-3

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

Описание

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

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

Объяснение

The 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, вызывающий отказ сегментации.

The 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 в коде, за исключением массивов в стиле С.

Поиск и устранение проблем

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

Примеры

расширить все

Этот код показывает, как 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