Puede una función de retorno de void g devolver f (); cuando f devuelve void?


Considere el siguiente fragmento:

void f(void);

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

¿Es esto return f(); válido según C11?

No estoy abogando por el uso de este patrón: si funciona en absoluto, es obviamente equivalente a f(); return; (donde el return; en sí sería redundante si esto está al final de la función g()). Estoy haciendo esta pregunta en el contexto del análisis estático de programas C, donde el código C ya ha sido escrito por alguien más y la pregunta es decidir si es válido o no de acuerdo con la estándar.

Yo interpretaría C11 6.8.6.4:1 en el sentido de que no es estándar y debe ser rechazado estáticamente. ¿Es posible interpretarlo de manera diferente(he encontrado este patrón en código fuente real y de alta calidad)?

Limitaciones

Una sentencia return con una expresión no aparecerá en una función cuyo tipo return es void. Una sentencia return sin expresión solo aparecerá en una función cuyo tipo de retorno sea anular.

Author: Pascal Cuoq, 2014-03-19

3 answers

Cualquier cosa después de return es una expresión.

6.8.6: 1 Instrucciones de salto

Syntax  

   ...
   return expressionopt; 

Y standard dice que:

Una sentencia return con una expresión no aparecerá en una función cuyo tipo return está vacío. ....

f() es también una expresión aquí. El compilador debería dar una advertencia

[Warning] ISO C forbids 'return' with expression, in function returning void [-pedantic]
 18
Author: haccks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-19 14:43:46

Esto claramente es una violación de restricción, en particular en vista de

6.3.2.2 void: El valor (inexistente) de una expresión void (una expresión que tiene tipo void) no se utilizará de ninguna manera,

Eso significa que el tipo incompleto void es un callejón sin salida que no se puede reutilizar para ningún propósito.

 10
Author: Jens Gustedt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-19 14:33:05

Establece claramente A return statement without an expression shall only appear in a function whose return type is void, intenta ejecutar esto:

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


int main(void) {
    f();
    return 0;
}
 0
Author: Sadique,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-19 14:28:21