exponenta event banner

CERT C++: ERR51-CPP

Обрабатывать все исключения

Описание

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

Обрабатывать все исключения. [1 ]

Внедрение Polyspace

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

Примеры

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

Проблема

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

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

Средство поиска ошибок и средство проверки кода интерпретируют это правило кодирования по-разному. Их анализ может дать разные результаты.

Риск

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

Зафиксировать

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

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

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

  • Обрабатывать непредвиденные исключения в 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 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.