Рассмотрим следующий фрагмент:
void f(void);
void g(…)
{
…
return f();
…
}
Является ли это return f();
действительным в соответствии с C11?
Я не сторонник использования этого шаблона: если он вообще работает, он, очевидно, эквивалентен f(); return;
(где сам return;
будет избыточным, если он находится в конце функции g()
). Я задаю этот вопрос в контексте статического анализа программ на C, где код C уже написан кем-то другим, и вопрос решает, действительно ли он соответствует стандарту.
Я бы интерпретировал C11 6.8.6.4:1 как означающий, что он нестандартен и должен быть статически отклонен. Можно ли интерпретировать его по-разному (я нашел этот шаблон в реальном и в противном случае высококачественном исходном коде)?
Ограничения
Оператор return с выражением не должен появляться в функции, тип возврата которой недействителен. Оператор return без выражения должен появляться только в функции, тип возврата которой недействителен.