exponenta event banner

CERT C++: DCL57-CPP

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

Описание

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

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

Реализация Polyspace

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

Примеры

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

Проблема

Флажки шашки:

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

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

Шашка не обнаруживает:

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

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

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