AUTOSAR C++14 Rule A15-3-4

Вместилище (замещающий знак и станд.:: исключение), обработчики должны использоваться только в (a) основном, (b) задаче основные функции, (c) в функциях, которые, как предполагается, изолируют независимые компоненты и (d) при вызове стороннего кода, который использует исключения не согласно C++ AUTOSAR 14 инструкций

Описание

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

Вместилище (замещающий знак и станд.:: исключение), обработчики должны использоваться только в (a) основном, (b) задаче основные функции, (c) в функциях, которые, как предполагается, изолируют независимые компоненты и (d) при вызове стороннего кода, который использует исключения не согласно C++ AUTOSAR 14 инструкций.

Объяснение

Всеобъемлющие обработчики, такие как catch(std::exception) или catch(...) блоки совпадают со многими различными типами исключений. Если вы обрабатываете исключение при помощи такого всеобъемлющего обработчика, у вас нет подробной и определенной информации о повышенном исключении. Такие всеобъемлющие обработчики не могут принять значимые меры, чтобы обработать повышенные исключения. Эти всеобъемлющие обработчики полезны в обработке непредвиденных исключительных ситуаций путем повышения исключений снова или путем соответствующего выхода из приложения.

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

  • Основные функции

  • Задача основные функции

  • Функции, которые вызывают стороннюю функцию, которая может быть несовместимой с C++ AUTOSAR 14 инструкций

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

Реализация Polyspace

Polyspace® отмечает catch(std::exception) и catch(...) блоки в функции, если ни один из них не верен:

  • Функцией является main() функция.

  • Функция является задачей основная функция.

  • Вызовы функции внешняя или сторонняя функция, которая может выйти за исключением.

Polyspace обнаруживает main() функция. Чтобы задать функцию как задачу основная функция, используйте эти параметры компиляции:

  • - точки входа <имя>

  • - циклические задачи <имя>

  • - прерывания <имя>

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

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

Примеры

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

В этом примере показано, как Polyspace отмечает всеобъемлющие обработчики в задаче основной функциональный EntryPoint и точка незаписи функционирует NonEntryPoint(). Задавать функциональный EntryPoint как задача основная функция, используйте опцию компиляции -entry-points EntryPoint.

#include <stdexcept>
#define MYEXCEPTION std::exception &
class ExceptionBased: std::exception {
};
typedef std::exception MyException;
typedef std::exception & MyExceptionRef;

void NonEntryPoint() 
{
	try {
		int i = 2;

		// ...
	} catch (int i) {                   // Compliant
	} catch (int &i) {                  // Compliant
	} catch (std::runtime_error e) {    // Compliant
	} catch (std::runtime_error& e) {   // Compliant
	} catch (std::exception *e) {       // Compliant
	} catch (std::exception e) {        // Noncompliant
	} catch (const std::exception& e) { // Noncompliant
	} catch(MyException e){             // Noncompliant
	} catch(ExceptionBased e){          // Compliant
	} catch (...) {                     // Noncompliant
	}
}
void EntryPoint() noexcept
{
	try {
		int i = 2;

		// ...
	} catch (MyException &e) {          // Compliant
	} catch (MyException e) {           // Compliant
	} catch (MyExceptionRef e) {        // Compliant
	} catch (ExceptionBased e) {        // Compliant
	} catch (const std::exception& e) { // Compliant
	} catch (MYEXCEPTION e) {           // Compliant
	}
}

Функциональный NonEntryPoint() не main() или задача основная функция. В этой функции Polyspace отмечает эти всеобъемлющие блоки:

  • catch (std::exception e) блок совпадает с различными типами исключений, которые выводят из класса std::exception. Этот всеобъемлющий обработчик полезен в основном или задаче основная функция. Поскольку NonEntryPoint() ни один main() ни задача основная функция, Polyspace отмечает оператор catch (std::exception e). По той же причине Polyspace отмечает оператор catch (std::exception& e).

  • MyException typedef из std::exception. catch(MyException e) блок совпадает с различными типами исключений, которые выводят из класса std::except. Поскольку NonEntryPoint() ни основное, ни задача основная функция, Polyspace отмечает оператор catch(MyException e).

  • Поскольку NonEntryPoint() ни основное, ни задача основная функция, Polyspace отмечает оператор catch(...)

Функциональный EntryPoint() задан как задача основная функция. Polyspace не отмечает всеобъемлющие блоки в этой функции.

#include <stdexcept>
void Fextern_throw(void);
void Fextern_nothrow(void) noexcept(true);
void Foo0()
{
	try {
		Fextern_nothrow();
	} catch (...) {                 // Noncompliant
	}
}
void Foo1()
{
	try {
		try {
			Fextern_throw();
		} catch (...) {               // Compliant
		}
	} catch (std::exception& e) {   // Compliant
	}
}
void Foo2()
{
	try {
		try {
			Fextern_nothrow();
		} catch (...) {               // Noncompliant
			Fextern_throw();            
		}
	} catch (std::exception& e) {   // Compliant
	}
}
  • Функциональный Foo0() вызывает сторонний функциональный Fextern_nothrow(), который задан как noexcept(true). Поскольку сторонний код задан как noexcept, Polyspace отмечает catch(...) блокируйтесь в Foo0().

  • Функциональный Foo1() вызывает сторонний функциональный Fextern_throw() то повышение силы исключение. Поскольку сторонний код может повысить исключение, Polyspace не отмечает всеобъемлющие блоки обработчика в Foo1().

  • Функциональный Foo2() содержит вложенный try-catch блок. Во внутреннем блоке, внешнем функциональном Fextern_nothrow() называется, который задан как noexcept(true). Polyspace отмечает catch(...) блокируйтесь во внутреннем try-catch блок. Всеобъемлющий блок во внешнем try-catch совместимо, потому что этот блок обрабатывает исключения, которые могут быть повышены внешним функциональным Fextern_throw().

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

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