AUTOSAR C++14 Rule A15-4-4

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

Описание

Определение правила

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

Объяснение

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

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

Реализация Polyspace

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

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

  • Вызываемая сущность не вызывает никаких исключений. В случае шаблонов классов и функций, по крайней мере, один экземпляр не вызывает исключения. При проверке вызываемых сущностей на исключения, Polyspace принимает внешние функции без определений, так же как noexcept(true). Для получения дополнительной информации о том, как Polyspace проверяет, вызывает ли вызываемую сущность исключение, смотрите раздел «Реализация Polyspace» 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 потому что это задано обусловленной noexcept оператор в коде.

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

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