CERT C++: ERR50-CPP

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

Описание

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

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

Реализация Polyspace

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

Примеры

расширить все

Проблема

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

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

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

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

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

Риск

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

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

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

  • Избегайте необработанных исключений. Например, выполните операции main() или основные функции задачи в try-catch блок. В блоках 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 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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