CERT C++: DCL57-CPP

Не позволяйте исключениям сбежать из деструкторов или функций освобождения

Описание

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

Не позволяйте исключениям сбежать из деструкторов или освобождения functions.[1]

Реализация Polyspace

Это средство проверки проверяет на деструктор Класса, выходящий за исключением.

Примеры

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

Проблема

Флаги средства проверки:

  • Явный throw операторы в теле деструктора за пределами try-catch блок. Если деструктор вызывает другую функцию, средство проверки не обнаруживает, если вызванная функция повышает исключение.

  • Спецификация исключения noexcept(false) в объявлении деструктора.

Средство проверки не обнаруживает:

  • catch оператор, который не отлавливает исключения всех типов, которые выданы.

    Средство проверки рассматривает присутствие catch оператор, соответствующий try блокируйтесь как индикация, что исключение отловлено.

  • throw операторы в catch блоки.

Риск

Деструкторы вызываются в конце выполнения кода. Когда исключения возникают на данном этапе, они становятся необработанными. Когда такие необработанные исключения возникают, в зависимости от аппаратного и программного обеспечения, которое вы используете, компилятор может резко отключить выполнение программы, не удаляя объекты в стеке. Такое резкое завершение может привести к утечке ресурсов и уязвимостям системы обеспечения безопасности.

Фиксация

Избегать этой проблемы:

  • Объявите деструкторы как noexcept(true).

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

Пример
#include<stdexcept>
class C {
	//...
	~C() noexcept(false) { //Noncompliant
		//...
		throw std::logic_error("Error"); //Noncompliant
	}
	
};

В этом примере, деструкторе класса C задан как noexcept(false). Polyspace® отмечает объявление. Деструктор содержит явный throw оператор, не монтируя в корпус его в try-catch блок. Polyspace отмечает throw оператор.

Коррекция

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

#include<stdexcept>
class C {
	//...
	~C() noexcept(true) { //Compliant
		//...
		try{
			throw std::logic_error("Error"); //Compliant
		}catch(...){
			
		}
	}
	
};

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

Группа: 01. Объявления и инициализация (DCL)
Введенный в 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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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