exponenta event banner

Правило AUTOSAR C++ 14 A12-8-1

Конструкторы перемещения и копирования должны перемещать и соответственно копировать базовые классы и элементы данных класса, без каких-либо побочных эффектов

Описание

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

Конструкторы перемещения и копирования должны перемещать и соответственно копировать базовые классы и элементы данных класса без каких-либо побочных эффектов.

Объяснение

Ожидаемое поведение конструкторов перемещения и копирования:

  • Они перемещают или копируют базовые классы и элементы данных.

  • Конструктор перемещения устанавливает исходный объект в допустимое состояние.

Создание конструкторов move или copy, имеющих дополнительные побочные эффекты, может вызвать следующие проблемы:

  • Производительность: конструкторы перемещения и копирования часто вызываются алгоритмами и контейнерами библиотеки стандартных шаблонов (STL). Накладные расходы на производительность в этих конструкторах, вызванные побочными эффектами, могут накапливаться и влиять на производительность кода.

  • Непредвиденное поведение: Поскольку компиляторы могут пропускать вызовы для копирования конструкторов для оптимизации кода, число вызовов конструктора копирования является неопределенным. В результате побочные эффекты конструктора копирования могут привести к неожиданному поведению.

Внедрение Polyspace

В теле конструктора копирования или перемещения Polyspace ® не помечает следующие операции:

  • Копирование или перемещение назначений.

  • Реляционные операции или операции сравнения.

  • Изменение исходного объекта в операции перемещения.

  • Вызовы функции std::swap или эквивалентный определяемый пользователем noexceot функции подкачки. Polyspace идентифицирует функции, которые эти сигнатуры как функции подкачки: void T::swap(T&) или void [N::]swap(T&, T&). Первая сигнатура представляет функцию-член класса T для этого требуется один аргумент. Вторая сигнатура представляет не являющуюся членом или статическую функцию в пространстве имен N для этого требуется два аргумента. Имя swap может быть без учета регистра и префиксом или постфиксированным подчеркиванием.

  • Присвоение и изменение static переменные.

Polyspace помечает любые другие операции в конструкторе копирования или перемещения как нежелательный побочный эффект. Например, вызов определяемой пользователем функции свопа считается нежелательным побочным эффектом, если функция свопа не является noexcept. Аналогичное правило для оператора назначения копирования и перемещения см. в разделе AUTOSAR C++14 Rule A6-2-1.

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

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

Примеры

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

Этот код показывает, как флаги Polyspace перемещают и копируют конструкторы, имеющие побочные эффекты.

#include<cstdint>
#include <utility>
#include<iostream>
class B
{
public:
	// Implementation
	B(B&& oth) : ptr(std::move(oth.ptr)) // Noncompliant
	{
		oth.ptr = nullptr; // Does not have a side effect
		std::cout<<"Moved"; //Has a side effect
	}
	~B()
	{
		delete ptr;
	}

private:
	std::int32_t* ptr;
};
class C
{
public:
	C(int t=0) : x(t) {}
	C(const C& oth): x(oth.x)  // Noncompliant
	{
		//...
		x = oth.x % 2;  // Has a side effect
		count++; //Not a side effect
	}

private:
	std::int32_t x;
	static std::int32_t count;
};
class D
{
public:

	D(const D& oth): x(oth.x)  // Noncompliant
	{
		D tmp(oth);
		_swap_(tmp);
	}
	void _swap_(D& rhs){ //Might raise exceptions
		//...
	}
private:
	std::int32_t x;
	static std::int32_t count;
};

  • В качестве побочного эффекта конструктор перемещения класса B печатает строку в выходном потоке. Этот побочный эффект добавляет к операции перемещения накладные расходы на производительность. Polyspace помечает оператор назначения перемещения и выделяет оператор. Настройка объекта, перемещенного из oth.ptr кому nullptr не является побочным эффектом.

  • Конструктор копирования класса C изменяет элемент данных x исходного объекта. Этот побочный эффект добавляет накладные расходы на производительность. Неожиданное изменение элементов данных во время операций перемещения и копирования может привести к несовместимости кода с библиотекой стандартных шаблонов и возникновению ошибок во время разработки. Polyspace помечает оператор назначения копирования и выделяет оператор x = oth.x % 2. Приращение статической переменной count не является побочным эффектом.

  • Конструктор копирования класса D вызывает определяемую пользователем функцию подкачки _swap_. Эта функция подкачки не является noexcept. Если исключение создано из _swap_исключение является неожиданным побочным эффектом конструктора копирования. Polyspace помечает конструктор копирования как несоответствующий этому правилу. Использовать пользовательские функции подкачки, которые являются noexcept.

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

Группа: Специальные функции-члены
Категория: Обязательно, Автоматизировано
Представлен в R2021a