Can a void-returning function g return f(); when f returns void?

核能气质少年 提交于 2019-11-29 10:53:15

问题


Consider the following snippet:

void f(void);

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

Is this return f(); valid according to C11?

I am not advocating using this pattern: if it works at all, it is obviously equivalent to f(); return; (where the return; itself would be redundant if this is at the end of function g()). I am asking this question in the context of the static analysis of C programs, where the C code has already been written by someone else and the question is deciding whether or not it is valid according to the standard.

I would interpret C11 6.8.6.4:1 as meaning that it is non-standard and should be statically rejected. Is it possible to interpret it differently (I have found this pattern in actual and otherwise high-quality source code)?

Constraints

A return statement with an expression shall not appear in a function whose return type is void. A return statement without an expression shall only appear in a function whose return type is void.


回答1:


Anything after return is an expression.

6.8.6:1 Jump statements

Syntax  

   ...
   return expressionopt; 

And standard says that:

A return statement with an expression shall not appear in a function whose return type is void. ....

f() is also an expression here. The compiler should raise a warning

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



回答2:


This clearly is a constraint violation, in particular in view of

6.3.2.2 void: The (nonexistent) value of a void expression (an expression that has type void) shall not be used in any way,

That means that the incomplete type void is a dead end that cannot be reused for any purpose whatsoever.




回答3:


It clearly states A return statement without an expression shall only appear in a function whose return type is void, try and execute this:

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


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


来源:https://stackoverflow.com/questions/22508978/can-a-void-returning-function-g-return-f-when-f-returns-void

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!