AUTOSAR C++14 Rule A15-3-3

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

Описание

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

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

Объяснение

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

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

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

  • Неожиданные исключения

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

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

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

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

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

Реализация Polyspace

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

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

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

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

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

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

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

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

  • -entry-points < имя >

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

  • -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