exponenta event banner

CERT C++: DCL57-CPP

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

Описание

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

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

Внедрение Polyspace

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

Примеры

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

Проблема

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

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

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

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

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

    Шашка считает наличие catch оператор, соответствующий try block как указание на то, что исключение перехвачено.

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

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

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