AUTOSAR C++14 Rule A18-5-2

Новое неразмещение или удаляет выражения, не буду использоваться

Описание

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

Новое неразмещение или удаляет выражения, не буду использоваться.

Объяснение

new оператор выделяет память. delete оператор освобождает память. Если вы используете эти операторы явным образом, необходимо связать их, чтобы избежать утечки памяти. Даже затем непредвиденные исключительные ситуации или возвраты могут привести к утечке памяти. Рассмотрите этот код, где память выделяется для указателя путем явного вызова new и освобожденный путем явного вызова delete.

std::int32_t ThrowError(){
	std::int32_t errorCode;
	std::int31_t* ptr = new std::int32_t{0};
	//...
	if(errorCode!=0){
		throw std::runtime_error{"Error"};
	}
	//...
	if (errorCode != -1) {
		return 1;  
	}
	delete ptr;  
	return errorCode;
}
Даже при том, что new оператор вместе с delete оператор, этот код может привести к утечке памяти в определенных обстоятельствах.

  • Если первый if() оператором является true, затем функция производит исключение и выходы, не удаляя указатель.

  • Если второй if() оператором является true, затем функция возвращает 1 и выходы, не удаляя указатель.

Чтобы избежать непредсказуемой утечки памяти, инкапсулируйте ресурсы, такие как динамически выделенная память или дескрипторы файлов, в объектах. Получите ресурсы в конструкторах Object и высвободите средства в объектных деструкторах. Этот шаблон разработки называется "Приобретением Ресурса, Инициализация" или RAII. После шаблона RAII предотвращает утечку памяти, даже когда существуют непредвиденные исключительные ситуации, и возвращается.

В качестве альтернативы используйте объекты менеджера, которые управляют временем жизни динамически выделенных ресурсов. Примеры объектов менеджера в стандартной библиотеке включают:

  • std::unique_ptr наряду с std::make_unique

  • std::shared_ptr наряду с std::make_shared

  • std::string

  • std::vector

Это правило не применяется к new оператор или delete оператор в пользовательских классах RAII и менеджерах.

Реализация Polyspace

AUTOSAR C++ 14 разрешений явное распределение ресурсов путем вызова new оператор в двух случаях, когда выделенный ресурс сразу передается:

  • Объект менеджера

  • Класс RAII, который не имеет безопасной альтернативы new оператор.

Polyspace® отмечает все явное использование new оператор и delete оператор. Если у вас есть процесс где new оператор может быть допустимым и нет никакой более безопасной альтернативы, выровняйте по ширине проблему при помощи комментариев в вашем результате или кода. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.

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

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

Этот код показывает, как Polyspace отмечает new или delete операторы.

#include <cstdint>
#include <memory>
#include <vector>
#include <cstddef>

using namespace std;

int32_t Fn1()
{
	int32_t errorCode{0};
	int32_t* ptr =
	new int32_t{0}; //Noncompliant
	// ...
	if (errorCode != 0) {
		throw  runtime_error{"Error"}; // Possible Memory Leak
	}
	// ...
	if (errorCode != 0) {
		return 1; //Possible Memory Leak
	}
	// ...
	delete ptr; //Noncompliant

	return errorCode; // Possible Memory Leak
}

int32_t Fn2()
{
	int32_t errorCode{0};
	// Alternative to 'new'
	unique_ptr<int32_t> ptr1 = make_unique< int32_t>(0); 
	unique_ptr<int32_t> ptr2(new  int32_t{0});   // Noncompliant
	shared_ptr<int32_t> ptr3 =
	make_shared<int32_t>(0);   //Compliant
	vector<int32_t> array;   // Compliant

	if (errorCode != 0) {
		throw  runtime_error{"Error"};   // No memory leaks
	}
	// ...
	if (errorCode != 0) {
		return 1; // No memory leaks
	}
	// ...
	return errorCode; // No memory leaks
}


class X
{
public:
	static void* operator new( size_t s)
	{
		return ::operator new(s);   // Noncompliant
	}

	static void* operator new[]( size_t s)
	{
		return ::operator new(s);   // Noncompliant
	}

	static void operator delete(void* ptr,  size_t s)
	{
		::operator delete(ptr);   // Noncompliant
	}

	static void operator delete[](void* ptr,  size_t s)
	{
		::operator delete(ptr);   // Noncompliant
	}
};

main(){
	X* x1    = new X;   // Noncompliant
	X* x2    = new X[2];   // Noncompliant
}

В Fn1(), операторы new и delete явным образом называются для управления ресурсами. Следовательно, непредвиденная исключительная ситуация или возврат могут привести к утечке памяти. Polyspace отмечает new и delete операторы. В Fn2(), объекты менеджера используются для управления памятью. Даже в случаях непредвиденных исключительных ситуаций и возвращается, в Fn2() нет никаких утечек памяти.

Класс X содержит пользовательские перегрузки для new и delete операторы. Polyspace отмечает все экземпляры new и delete операторы в определениях пользовательских перегрузок. В основном (), Polyspace также отмечает перегруженные новые и операторы delete.

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

Группа: вспомогательная библиотека Языка
Категория: Необходимый, Частично автоматизированный
Введенный в R2020a