AUTOSAR C++14 Rule A15-3-3

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

Описание

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

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

Объяснение

Во время выполнения main() или задача основная функция, различные исключения могут возникнуть. Например:

  • Явным образом повышенные исключения класса std::exception

  • Исключения, являющиеся результатом сторонних библиотек, которыми вы пользуетесь

  • Непредвиденные исключительные ситуации

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

Необработанные исключения могут вызвать аварийное завершение выполнения программы, ведя к утечкам памяти и уязвимостям системы обеспечения безопасности. Чтобы избежать этих проблем, выполните операции main() или задача основные функции в a try-catch блок. В блоках выгоды:

  • Обработайте исключения типа std::exception явным образом в соответствующих блоках выгоды.

  • Обработайте базовый класс исключений, являющихся результатом сторонних библиотек.

  • Обработайте непредвиденные исключительные ситуации в catch(...) блок.

Реализация Polyspace

  • Polyspace® отмечает main() функционируйте или задача основная функция если:

    • Необработанные исключения повышены в функции. Например, исключения, которые повышены вне try-catch блокируйтесь или в выгоде блок может остаться необработанным.

    • Функция не имеет try-catch блок.

    • Функция не имеет блоков выгоды, чтобы явным образом обработать std::exception введите исключения.

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

  • Polyspace не проверяет, обработаны ли исключения из сторонних библиотек.

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

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

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

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

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

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

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

Примеры

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

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

#include <stdexcept>
void f_throw() {             // Compliant
  throw 1;
}
void Noncompliant()     // Noncompliant 
{
  try {

  } catch (std::exception& e) {
	  f_throw();              // throw
  } catch (...) {
	  throw;
  }
}
int Noncompliant2()     // Noncompliant 
{
  f_throw();              // throw
  try {

  } catch (std::exception& e) {
  } catch (...) {
  }
  return 0;
}
int Compliant()   // Compliant
{

  try {
    // program code
  } catch (std::runtime_error& e) {
    // Handle runtime errors
  } catch (std::logic_error& e) {
    // Handle logic errors
  } catch (std::exception& e) {
    // Handle all expected exceptions
  }catch (...) {
    // Handle all unexpected exceptions
  }

  return 0;
}
int main()   // Noncompliant
{

  try {
    // program code
  } catch (std::runtime_error& e) {
    // Handle runtime errors
  } catch (std::logic_error& e) {
    // Handle logic errors
  } catch (std::exception& e) {
    // Handle all expected exceptions
  }
  return 0;
}

  • Функциональный f_throw() выходы с необработанным исключением. Поскольку эта функция не является основным или задачей основная функция, Polyspace не отмечает его.

  • Функциональный Noncompliant() и Noncompliant2() заданы как задача основные функции. В этих функциях, f_throw повышает исключение, которое не обработано. Поскольку они определяют задачу для основных функций, не обрабатывают все исключения, которые могут возникнуть, Polyspace отмечает их. Заключите операции, которые могут повысить исключение в try-catch блокируйтесь, чтобы обработать исключения, которые могут возникнуть.

  • Функциональный main() не имеет catch(...) блокируйтесь, чтобы обработать любые непредвиденные исключительные ситуации. Поскольку main() функция не обрабатывает все исключения, которые могут возникнуть, Polyspace отмечает ее.

  • Функциональный Compliant задан как задача основная функция. Эта функция имеет catch для всех исключений, которые могут возникнуть. Polyspace не отмечает его.

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

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