MISRA C++:2008 Rule 15-3-3

Обработчики реализации функционального блока попытки конструктора класса или деструктора не должны ссылаться на нестатические члены от этого класса или его основ

Описание

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

Обработчики реализации функционального блока попытки конструктора класса или деструктора не должны ссылаться на нестатические члены от этого класса или его основ.

Объяснение

Обработчик catch блоки функционального try блок обрабатывает исключение, которые повышены от тела функции и списка инициализаторов. Когда используется в конструкторах класса и деструкторах, они catch блоки могут обработать исключения, которые возникают во время создания или разрушения класса нестатические члены. Таким образом, catch блоки могут быть выполнены прежде или после времени жизни нестатических членов класса. Если к нестатическим членам класса получают доступ в таком catch блоки, компилятор может попытаться получить доступ к объектам, которые еще не созданы или уже удалены, который является неопределенным поведением. Например:

class C{
	
	private:
	int* inptr_x;
	public:
	C() try: inptr_x(new int){}
	catch(...){
		intptr_x = nullptr;
		//...
	}
};
Здесь, конструктор C реализован при помощи функционального try блокируйтесь, чтобы обработать любое исключение, являющееся результатом операции выделения памяти в списке инициализаторов. В catch блок этой функции-try блокируйтесь, член класса C.intptr_x получен доступ. Блок выгоды выполняется когда выделение памяти для intptr_x не пройдено. Таким образом, блок выгоды пытается получить доступ к члену перед своим временем жизни, которое является неопределенным поведением.

Чтобы избежать неопределенного поведения, избегайте использования нестатических элементов данных или базовых классов объекта в блоке выгоды реализации функционального блока попытки его конструкторов и деструктора.

Реализация Polyspace

Если оператор в блоке выгоды конструктора или функции-try деструктора доступы к блоку любой из них, Polyspace® флаги оператор:

  • Нестатические члены объекта

  • Базовые классы объекта

  • Нестатические члены базовых классов

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

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

Примеры

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

#include<cstdint>
class B
{
public:
	B ( ) try: x(0){/*...*/}
	catch ( ... )
	{
		if ( 0 == x ){/*...*/}  //Noncompliant
		//...
	}
	~B ( ) try{/*...*/}
	catch ( ... )
	{
		if ( 0 == x ){/*...*/} //Noncompliant
		//...
		else if (sb == 1){/*...*/} //Compliant
		//....	
	}
public:
	static int32_t sb;
protected:
	int32_t x;
};

class D : public B
{
public:
	D ( ) try: B(),y{0}{/*...*/}
	catch ( ... )
	{
		if ( 0 == x ){/*...*/}  //Noncompliant
		//...
		else if (y == 1){/*...*/}   //Noncompliant
		//...
	}
	~D ( )try {/*...*/}
	catch ( ... )
	{
		if ( 0 == x ) {/*...*/} //Noncompliant
		//...
	}
protected:
	int32_t y;
};

В этом примере, конструкторах и деструкторах B и D реализованы при помощи блоков функциональной попытки. catch блоки их функционируют-try блокирует доступ нестатические члены класса и его базового класса. Флаги Polyspace, получающие доступ к этим нестатическим членам в catch блоки. Поскольку время жизни static члены больше времени жизни самого объекта, Polyspace не отмечает доступ static объекты в них catch блоки.

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

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