exponenta event banner

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

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

Описание

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

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

Объяснение

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

  • Явно поднятые исключения класса std::exception

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

  • Непредвиденные исключения

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

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

  • Обрабатывать исключения типа std::exception явно в соответствующих блоках catch.

  • Обработка базового класса исключений, возникающих из сторонних библиотек.

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

Внедрение Polyspace

  • Флаги Polyspace ® main() функцию или основную функцию задачи, если:

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

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

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

    • Функция не имеет catch-all или catch(...) блоки для обработки непредвиденных исключений.

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

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

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

  • -entry-points < имя >

  • -cyclic-задачи < имя >

  • -interrupts < имя >

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

В этом примере показано, как флаги 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