AUTOSAR C++14 Rule A7-6-1

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

Описание

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

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

Объяснение

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

Если функция не имеет никакого return оператор, затем итоговая закрывающая фигурная скобка функции подразумевает неявный return. Исключение return оператор в функции не препятствует тому, чтобы поток выполнения возвратился. [[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() функция, поток выполнения пропускает if-else-if блок кода и возвращается к вызывающей стороне неявно если i == 0. Поскольку [[noreturn]] функция возвращает поток выполнения в пути выполнения кода, эта функция несовместима с этим правилом.

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

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

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

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

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

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

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