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