CERT C++: MSC53-CPP

Не возвращайтесь из функции, объявил [[noreturn]]

Описание

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

Не возвращайтесь из функции, объявил [[noreturn]] [1]

Реализация Polyspace

Это средство проверки проверяет на [[noreturn]] функции, возвращающиеся к Вызывающей стороне.

Примеры

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

Проблема

Этот дефект происходит когда [[noreturn]] функционируйте в конечном счете возвращает поток выполнения к функции вызывающей стороны. Компилятор ожидает, что функция объявила при помощи [[noreturn]] атрибут не возвращает поток выполнения. Таким образом, если [[noreturn]] функциональный f() называется от main(), затем компилятор ожидает, что поток выполнения не возвращен в main(). Если такая функция в конечном счете возвращает поток выполнения, это приводит к неопределенному поведению.

Риск

Если [[noreturn]] функционируйте в конечном счете возвращает поток выполнения, он приводит к неопределенному поведению, которое может быть использовано, чтобы вызвать нарушения целостности данных.

Фиксация

Если функция не имеет никакого return оператор, затем итоговая закрывающая фигурная скобка функции подразумевает неявный return. Исключение return оператор в функции не препятствует тому, чтобы поток выполнения возвратился. [[noreturn]] функция может запретить возврат потока выполнения к функции вызова:

  • Ввод бесконечного цикла

  • Повышение исключения

  • Вызов другого [[noreturn]] функция

Пример

Рассмотрите следующий код, содержащий функциональный noncompliant(), который объявляется как [[noreturn]].

#include <cstdlib>
[[noreturn]] void bad_f(int i)
{
	if (i > 0)
	throw "Received positive input";
	else if (i < 0)
	std::exit(0);
} //Noncompliant

Когда вход i нуль, поток выполнения пропускает if-else-if блок кода и возвращается к вызывающей стороне неявно. Поскольку [[noreturn]] функция возвращает поток выполнения в пути выполнения кода, эта функция несовместима с этим правилом.

Коррекция

[[noreturn]] функция не должна возвращать поток выполнения в пути выполнения кода. Можно предотвратить возврат несколькими способами. Рассмотрите следующий код где [[noreturn]] функция не возвращает поток выполнения в пути выполнения кода.

#include <cstdlib>
[[noreturn]] void compliant(int i)
{
	if (i > 0)
	throw "Received positive input";
	else if (i < 0)
	std::exit(0);
	else if(i==0)
	while(true){
		//...
	}
}//Compliant

Эта функция совместима с этим правилом потому что:

  • Когда i > 0, функция повышает исключение.

  • Когда i < 0, вызовы функции [[noreturn]] функциональный std::exit().

  • Когда i==0, функция вводит бесконечный цикл.

Поскольку [[noreturn]] функция не возвращает поток выполнения в пути к вызову, это совместимо с этим правилом.

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

Группа: 49. Разное (MSC)
Введенный в R2020b

[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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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