AUTOSAR C++14 Rule A12-8-1

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

Описание

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

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

Объяснение

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

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

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

Авторские перемещения или копирование конструкторов, которые имеют дополнительные побочные эффекты, могут вызвать следующие проблемы:

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

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

Реализация Polyspace

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

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

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

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

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

  • Назначение и изменение static переменные.

Polyspace помечает любые другие операции в конструкторе копирования или перемещения как нежелательный побочный эффект. Например, вызов пользовательской функции swap рассматривается как нежелательный побочный эффект, если функция swap не 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, вызываемую _swap_. Эта функция swap не noexcept. Если вызвано исключение из _swap_исключение является неожиданным побочным эффектом конструктора копирования. Polyspace помечает конструктор копирования как несовместимый с этим правилом. Используйте пользовательские функции подкачки, которые noexcept.

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

Группа: Специальные функции представителей
Категория: Необходимый, Автоматизированный
Введенный в R2021a