CERT C++: ERR51-CPP

Обработайте все исключения

Описание

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

Обработайте весь exceptions.[1]

Реализация Polyspace

Это средство проверки проверяет на Необработанное исключение, не отловленное.

Примеры

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

Проблема

Средство проверки показывает нарушение, если нет никакого try/catch в main функционируйте или catch блок не обрабатывает все исключения при помощи catch(...) блок. Правило не проверяется если main функция не существует.

Средство проверки не определяет, распространяет ли исключение необработанного типа на самом деле к main.

Bug Finder и Программа автоматического доказательства Кода интерпретируют это правило кодирования по-другому. Их исследования могут привести к различным результатам.

Риск

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

Фиксация

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

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

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

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

Пример — исключения могут остаться необработанными
#include <stdexcept>
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;
}

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

Коррекция

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

#include <stdexcept>
int main(){   // 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(...){
	  //Exit gracefully
  }
  return 0;
}

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

Группа: 08. Исключения и обработка ошибок (ERR)
Введенный в R2019a

[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ-МЕЛЛОН И/ИЛИ ЕГО ИНСТИТУТА ПРОГРАММНОЙ ИНЖЕНЕРИИ СОДЕРЖАЛ, ЗДЕСЬ ПРЕДОСТАВЛЯЕТСЯ НА БАЗИСЕ "ASIS". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.