AUTOSAR C++14 Rule A15-4-5

Контролируемые исключительные ситуации, которые могли быть выданы от функции, должны быть заданы вместе с объявлением функции, и они должны быть идентичными во всех объявлениях функции и для всех его сверхнаездников

Описание

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

Контролируемые исключительные ситуации, которые могли быть выданы от функции, должны быть заданы вместе с объявлением функции, и они должны быть идентичными во всех объявлениях функции и для всех его сверхнаездников.

Объяснение

На C++ нет никаких контролируемых исключительных ситуаций, потому что компилятор не осуществляет функции, чтобы задать или обработать исключения, которые могут повысить функции. Спецификация динамического исключения формы throw(<>) является устаревшим и подверженным ошибкам. Спецификация исключения, предписанная в стандарте C++, задает только, повышает ли функция исключение или не при помощи спецификатора noexcept. Поскольку нет никакого официального способа объявить, какие исключения могут явиться результатом функции, стандарт AUTOSAR требует, чтобы каждое объявление функции сопровождалось комментариями что документ вручение исключения функции. Этот метод документирования исключений похож на механизм обработки исключений JAVA.

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

Реализация Polyspace

Polyspace® повышения это средство проверки, когда любое из этих условий верно:

  • Функция повышает контролируемую исключительную ситуацию, но не документирует ее перед ее объявлением.

  • Функция не повышает все контролируемые исключительные ситуации, которые документируются в комментарии перед ее объявлением.

  • Функциональные документы исключение непроверенное.

  • Функциональные документы исключение, но не задает его.

Это средство проверки игнорирует функции члена класса, которые не вызваны в вашем коде.

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

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

Примеры

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

#include <cstdint>
#include <stdexcept>

class ObjectType1{};
class ObjectType2{};
/// @checkedException
class TypeError : public std::exception
{
	// Implementation
};
/// @checkedException
class DimMismatch : public std::exception
{
	// Implementation
};
/// @checkedException
class SizeError : public std::exception
{
	// Implementation
};
/// @throw TypeError Unexpetced Object Type as Input
/// @throw DimMismatch Container Dimension Mismatched
/// @throw SizeError    Object Size Too large
void Transform1(ObjectType1& substrate,
               ObjectType2& coating) noexcept(false) //Compliant
{
	// ...
	throw TypeError();
	// ...
	throw DimMismatch();
	// ...
	throw SizeError();
	// ...
}
/// @throw TypeError Unexpetced Object Type as Input
void Transform2(ObjectType1& substrate,
             ObjectType2& coating) noexcept(false) //Noncompliant
//The function raises SizeError
//but does not document it before its declaration.
{
	// ...
	throw TypeError();
	// ...
	throw SizeError();
	// ...
}
class ValidationError : std::exception

{
	// Implementation
};
/// @throw TypeError Unexpetced Object Type as Input
/// @throw DimMismatch Container Dimension Mismatched
/// @throw SizeError   Object Size Too large
/// @throw ValidationError Checksum is Negative

void Transform3(ObjectType1& substrate,
               ObjectType2& coating) noexcept(false) //Noncompliant
// The function does not raise all the @throw exceptions
// The function documents an unchecked exception ValidationError.
{
	// ...
	throw TypeError();
	// ...
	throw SizeError();
	// ...
}
/// @throw TypeError Unexpetced Object Type as Input
/// @throw LengthMismatch Array Length Mismatched
void Transform4(void){//Noncompliant
// The function does not define the documented exception LengthMismatch
	// ...
	throw TypeError();
	// ...
	
}

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

  • Функциональный Transform1 совместимо с этим правилом, потому что оно задает три контролируемых исключительных ситуации перед своим объявлением и затем повышает те же контролируемые исключительные ситуации в ее теле.

  • Функциональный Transform2 несовместимо с этим правилом, потому что оно повышает проверенный exceptionSizeError но не документирует исключение в комментариях перед объявлением функции.

  • Функциональный Transform2 нарушает правило двумя различными способами:

    • Функциональные документы контролируемая исключительная ситуация DimMismatch в комментариях перед объявлением функции, но не повышает его в теле функции.

    • Функциональные документы исключение ValidationError перед его объявлением, но исключением не перечислен как контролируемая исключительная ситуация.

  • Функциональный Transform4 несовместимо с этим правилом, потому что оно документирует исключение LengthMismatch но код не имеет определения этого типа.

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

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