exponenta event banner

CERT C++: ERR50-CPP

Не прекращайте программу внезапно

Описание

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

Не завершайте программу внезапно. [1 ]

Внедрение Polyspace

Эта проверка проверяет неявный вызов функции terminate ().

Примеры

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

Проблема

Средство проверки помечает эти ситуации, когда terminate() функция может быть вызвана неявно:

  • Исключение остается необработанным. Например:

    • При обработке исключения он проходит через другую функцию, которая вызывает необработанное исключение. Например, оператор catch или обработчик исключений вызывает другую функцию, которая вызывает необработанное исключение.

    • Инструкция throw без операнда снова вызывает необработанное исключение.

  • Деструктор класса вызывает исключение.

Риск

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

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

Чтобы избежать неявных вызовов terminate():

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

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

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

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

  • Объявить деструкторы как noexcept и обрабатывать исключения в деструкторах.

Пример - неявный вызов terminate
#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() обрабатывает определенные типы исключений. Непредвиденное исключение остается необработанным, что приводит к неявному вызову функции terminate, что привело к резкому прекращению программы. Поскольку main() требования terminate неявно, Polyspace ® вызывает этот дефект.

Исправление - обработка непредвиденных исключений

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

#include <stdexcept>
[[noreturn]] void gracefulExit(){
	// unwind stack and report errors
	std::terminate();
}
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
	  gracefulExit();
  }
  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 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

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