AUTOSAR C++14 Rule A12-8-1

Переместите и скопируйте конструкторов, перемещу и соответственно скопирую базовые классы и элементы данных класса, без любых побочных эффектов

Описание

Управляйте определением

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

Объяснение

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

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

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

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

  • Производительность: Переместите и скопируйте конструкторов, часто вызываются алгоритмами стандартной библиотеки шаблонов (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