AUTOSAR C++14 Rule A15-5-3

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

Описание

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

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

Реализация Polyspace

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

  • Исключение остается необработанным. Например:

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

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

  • Деструктор класса повышает исключение.

  • Обработчик завершения, который передается 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 отмечает функцию.

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

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