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

Оконечное () функция не должно быть названо неявно

Описание

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

Оконечное () функция не должно быть названо неявно.

Реализация Polyspace

Средство проверки отмечает ситуации, которые могут привести к вызову функционального std::terminate() неявно. Эти ситуации могут включать:

  • Исключение выходит непойманный. Это также нарушает MISRA C++:2008 Rule 15-3-2. Например:

    • Прежде чем исключение отловлено, оно выходит через другую функцию, которая выдает неперехваченное исключение. Например, оператор выгоды или обработчик исключений вызывают конструктора копии, который выдает неперехваченное исключение.

    • Пустой throw выражение повышает неперехваченное исключение снова.

  • Деструктор класса повышает исключение. Исключения в деструкторах также нарушают MISRA C++:2008 Rule 15-5-1.

  • Обработчик завершения, который передается std::atexit повышает необработанное исключение.

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

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

Примеры

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

#include <stdexcept>
#include <new>
class obj
{
public:
	obj() noexcept(false){}
	obj(const obj& a){
		//...
		throw -1;
	}
	~obj()
	{
		try{
			// ...
			throw std::runtime_error("Error2"); // Noncompliant
		}catch(std::bad_alloc& e){
			
		}
	}
};
obj globalObject;
void atexit_handler(){//Noncompliant
	throw std::runtime_error("Error in atexit function");
}
void main(){//Noncompliant
	try{
		//...
		obj localObject = globalObject;
		std::atexit(atexit_handler);
	}catch(std::exception& e){
		
	}
}

В этом примере, Polyspace® необработанные исключения флагов, потому что они приводят к неявным вызовам std::terminate().

  • Деструктор ~obj() не отлавливает исключение, повышенное throw оператор. Необработанное исключение в деструкторе приводит к резкому завершению программы через неявный вызов std::terminate. Polyspace отмечает throw оператор в деструкторе obj.

  • main() функция не обрабатывает все исключения, повышенные в коде. Поскольку необработанное исключение может привести к неявному вызову std::terminate(), Polyspace отмечает main() функция.

  • Обработчик завершения atexit_handler повышает неперехваченное исключение. Функциональный atexit_handler выполняется после основного выполнения концов. Необработанные исключения в этой функции не могут быть обработаны в другом месте, ведя к неявному вызову std::terminate(). Polyspace отмечает функцию.

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

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