AUTOSAR C++14 Rule A15-2-2

Если конструктор не будет noexcept, и конструктор не может закончить объектную инициализацию, то это должно освободить ресурсы объекта, и это должно выдать исключение

Описание

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

Если конструктор не будет noexcept, и конструктор не может закончить объектную инициализацию, то это должно освободить ресурсы объекта, и это должно выдать исключение.

Объяснение

Когда конструктор резко отключает из-за необработанного исключения или привел динамическое распределение ресурсов к сбою, оно может оставить некоторые объекты в частично созданном объекте, который является неопределенным поведением. Прежде, чем повысить исключения в конструкторах класса, освободите уже выделенные ресурсы. При выделении ресурсов задайте new операция как std::nothrow. В качестве альтернативы выполните распределение ресурсов в try или function-try блокируйтесь, чтобы обработать исключения, которые могут явиться результатом не пройдено выделения.

Реализация Polyspace

Polyspace® отмечает throw или new оператор вне try блокируйтесь в non-noexcept конструктор класса, если оператор может привести к утечке ресурсов. Например:

  • throw оператор вне try блок отмечается, если выделенные ресурсы не освобождены перед оператором.

  • new оператор отмечается, если он не задан как std::nothrow или перенесенный в try или function-try блок.

Polyspace игнорирует классы, которые остаются неиспользованными в вашем коде.

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

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

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

#include<cstdlib>
 class complex_ptr{
	
	complex_ptr(){
		real = (double*)malloc(sizeof(double));
		imag = (double*)malloc(sizeof(double));
		if(real==nullptr || imag==nullptr){
			throw; //Noncompliant
		}
	}
	~complex_ptr(){
		free(real);
		free(imag);
	}
	private:
	double* real;
	double* imag;
	
};
class complex_ptr2{
	
	complex_ptr2() {
		real = (double*)malloc(sizeof(double));
		imag = (double*)malloc(sizeof(double));
		if(real==nullptr || imag==nullptr){
			deallocate();
			throw; //Compliant
		}
	}
	void deallocate(){
		free(real);
		free(imag);
	}
	~complex_ptr2(){
		deallocate();
	}
	private:
	double* real;
	double* imag;
	
};
void foo(void){
	complex_ptr Z;
	complex_ptr2 X;
	//...
}

В этом примере, класс complex_ptr ответственно за выделение и освобождение двух необработанных указателей на double. Конструктор complex_ptr::complex_ptr() завершает работу за исключением, когда операция выделения памяти перестала работать. Класс выходит из осциллографа прежде, чем освободить уже выделенные ресурсы, приводя к частично созданному объекту. Polyspace отмечает throw оператор в конструкторе.

Подобно complex_ptr, конструктор класса complex_ptr2 повышает исключение, когда операция выделения памяти перестала работать. Прежде, чем повысить исключение, конструктор освобождает выделенную память путем вызова deallocate(). Этот конструктор совместим с этим правилом.

#include<cstdlib>
#include <stdexcept>
#include <new>
 class complex_ptr{
	
	complex_ptr(): real(new double), imag(new double){ //Noncompliant		
		
	}
	~complex_ptr(){
		delete real;
		delete imag;
	}
	private:
	double* real;
	double* imag;
	
};

class complex_ptr2{
	
	complex_ptr2() try: real(new double), imag(new double){	//Compliant	
		
	}catch(std::bad_alloc){
		//...
	}
	~complex_ptr2(){
		delete real;
		delete imag;
	}
	private:
	double* real;
	double* imag;
	
};

void foo(void){
	complex_ptr Z;
	complex_ptr2 X;
	//...
}

В этом примере, конструкторе complex_ptr выполняет new операции, которые могут повысить исключения. Поскольку у конструктора нет механизма для того, чтобы обработать эти исключения, они могут заставить конструктора резко завершать работу. Такое завершение может оставить объект в частично заданном состоянии, потому что выделенные ресурсы не освобождены. Polyspace отмечает конструктора. Конструктор complex_ptr2 выполняет новые операции в function-try блокируйтесь и обрабатывает потенциальные исключения в catch блок. Этот конструктор совместим с правилом, потому что оно обрабатывает исключения, которые могут явиться результатом new операции.

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

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