AUTOSAR C++14 Rule A15-4-4

Объявление неброска функции должно содержать noexcept спецификацию

Описание

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

Объявление неброска функции должно содержать noexcept спецификацию.

Объяснение

Определение функционирует, которые не повышают исключения при помощи спецификатора noexcept или noexcept(true) позволяет компилятору выполнить определенную оптимизацию для этих функций, таких как исключение процесса обработки исключений. Определение спецификации исключения функций ясно передает это, вы ожидаете, что функции не повысят исключения.

Задайте функции, которые не повышают исключения при помощи спецификатора noexcept. Если спецификация исключения функции зависит от аргумента шаблона, используйте noexcept(<condition>). Если спецификация исключения функции неизвестна, примите, что она повышает исключения.

Реализация Polyspace

Polyspace® отмечает определение вызываемой сущности, такой как функция, класс или шаблон функции или конструкторы класса, если следующее верно:

  • Вызываемая сущность задана. Polyspace не отмечает функции, которые объявлены, но не заданы. Polyspace проверяет шаблоны функций или шаблоны классов, которые имеют по крайней мере одно инстанцирование.

  • Вызываемая сущность не повышает исключений. В случае шаблонов классов и функций, по крайней мере одно инстанцирование не повышает исключения. При проверке вызываемых сущностей на исключения Polyspace принимает, что внешние функции без определений ведут себя как noexcept(true). Для получения дополнительной информации о том, как Polyspace проверяет, повышает ли вызываемая сущность исключение, смотрите раздел Polyspace Implementation AUTOSAR C++14 Rule A15-4-2.

  • Вызываемая сущность не имеет никакой спецификации исключения.

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

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

Примеры

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

#include <iostream>
#include <stdexcept>
void F1();  
void F2() noexcept; 
void F3() noexcept(true); 
void F4() noexcept(false); 

void F5(){ //Noncompliant

	F2();    
	F3();    

}

void F6() noexcept    // Compliant
{
	try {
		F4();   
	}catch (std::exception& e) {
		// Handle exceptions
	}
}

class NotThrowing {
public:
	NotThrowing() { // Noncompliant
		F2();
	}
};

class Throwing{
public:
	Throwing() { // Compliant 
		F4();
	}
};
template <class T, bool B> void CompliantClasshandler() noexcept(B) { //Compliant
	//...
}

template <class T> void NoncompliantClasshandler() { // Noncompliant
	//...
}

int Factory() noexcept{
	Throwing a;
	NotThrowing b;
	NoncompliantClasshandler<Throwing>();
	NoncompliantClasshandler<NotThrowing>();
	CompliantClasshandler<Throwing, true>();
	CompliantClasshandler<NotThrowing, false>();
	return 1;
}

  • Функциональный F5 не повышает исключения, но это не отмечено как noexcept в коде. Polyspace отмечает определения функции. Функциональный F6 не повышает исключения, и это задано как noexcept в коде. Polyspace не делает флага F6.

  • Polyspace проверяет конструкторов классов, когда классы используются в коде. В этом примере, классы Throwing и NotThrowing инстанцированы и Polyspace проверяет их конструкторов.

    Конструктор класса NotThrowing не повышает исключения, но это не задано как noexcept в коде. Polyspace отмечает функцию. Конструктор класса Throwing исключение повышений и это не заданы как noexcept в коде. Polyspace не отмечает этого конструктора.

  • Polyspace проверяет шаблоны функций, когда шаблон инстанцируют. В этом примере Polyspace проверяет шаблоны CompliantClasshandler и NoncompliantClasshandler потому что они инстанцируют в Factory.

    Поскольку инстанцирование NoncompliantClasshandler в Factory с классом NotThrowing не повышает исключение, и шаблон не задан как noexcept в коде Polyspace отмечает определение NoncompliantClasshandler. Polyspace не отмечает шаблон CompliantClasshandler потому что это задано conditionalized noexcept оператор в коде.

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

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