Подтвердить что ты не робот

Может ли функция возврата void f возвращать f(); когда f возвращает void?

Рассмотрим следующий фрагмент:

void f(void);

void g(…)
{
  …
  return f();
  …
}

Является ли это return f(); действительным в соответствии с C11?

Я не сторонник использования этого шаблона: если он вообще работает, он, очевидно, эквивалентен f(); return; (где сам return; будет избыточным, если он находится в конце функции g()). Я задаю этот вопрос в контексте статического анализа программ на C, где код C уже написан кем-то другим, и вопрос решает, действительно ли он соответствует стандарту.

Я бы интерпретировал C11 6.8.6.4:1 как означающий, что он нестандартен и должен быть статически отклонен. Можно ли интерпретировать его по-разному (я нашел этот шаблон в реальном и в противном случае высококачественном исходном коде)?

Ограничения

Оператор return с выражением не должен появляться в функции, тип возврата которой недействителен. Оператор return без выражения должен появляться только в функции, тип возврата которой недействителен.

4b9b3361

Ответ 1

Все, что после return является выражением.

6.8.6: 1 Операторы перехода

Syntax  

   ...
   return expressionopt; 

И стандарт говорит, что:

Оператор return с выражением не должен появляться в функции, тип возврата которой является недействительным.....

f() также является выражением. Компилятор должен предупредить

[Warning] ISO C forbids 'return' with expression, in function returning void [-pedantic]

Ответ 2

Это явно является нарушением ограничения, в частности, ввиду

6.3.2.2 void: (несуществующее) значение выражения void (выражение, которое имеет тип void) не должно использоваться каким-либо образом,

Это означает, что неполный тип void является тупиком, который нельзя использовать повторно для каких-либо целей.

Ответ 3

В нем четко указано A return statement without an expression shall only appear in a function whose return type is void, попробуйте выполнить следующее:

void g()
{
    return; // does not return any expression at all
}
void f()
{
    return g();
}


int main(void) {
    f();
    return 0;
}