CERT C++: ERR51-CPP

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

Описание

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

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

Реализация Polyspace

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

Примеры

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

Проблема

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

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

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

Риск

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

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

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

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

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