Может ли функция возврата 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 без выражения должен появляться только в функции, тип возврата которой недействителен.
Ответы
Ответ 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;
}