exponenta event banner

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

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

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

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

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

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

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

Группа: Объявление
Категория: Обязательно, Автоматизировано
Представлен в R2020b