exponenta event banner

Правило AUTOSAR C++ 14 A15-4-4

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

Описание

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

Описание функции отсутствия метания должно содержать технические условия, отличные от технических условий.

Объяснение

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

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

Внедрение Polyspace

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

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

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

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

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

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