AUTOSAR C++14 Rule A7-6-1

Функции, объявленные с атрибутом [[noreturn]], не возвращаются

Описание

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

Функции, объявленные с атрибутом [[noreturn]], не возвращаются.

Объяснение

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

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

  • Вход в бесконечный цикл

  • Выдвижение исключения

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

Реализация Polyspace

Если функция задана как [[noreturn]] возвращает поток управления своему вызывающему абоненту, Polyspace® флаги [[noreturn]] функция.

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

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

Допустим, этот код содержит два [[noreturn]] функций.

#include <iostream>

[[noreturn]] void noncompliant(int i)
{
	if (i > 0)
	throw "Received positive input";
	else if (i < 0)
	std::exit(0);
} //Noncompliant
[[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
  • В noncompliant() function, поток выполнения пропускает if-else-if блок кода и неявно возвращается к вызывающему абоненту, если i == 0. Потому что [[noreturn]] функция возвращает поток выполнения в код пути, эта функция не совместима с этим правилом.

  • В compliant() функция:

    • Функция вызывает исключение, если i > 0.

    • Функция вызывает [[noreturn]] функциональные std::exit() если i < 0.

    • Функция входит в бесконечный цикл, если i==0.

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

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

Группа: Декларация
Категория: Необходимый, Автоматизированный
Введенный в R2020b