Pregunta relacionada: Any good reason why assignment operator isn't a sequence point?es i = f(); definido cuando f modifica i?
Del comp.lang.c FAQ inferiría que el programa siguiente no está definido. Curiosamente, solo menciona la llamada a f
como un punto de secuencia, entre el cálculo de los argumentos y la transferencia de control a f
. La transferencia de control de f
a la expresión de llamada no aparece como un punto de secuencia.
int f(void) { i++; return 42; }
i = f();
¿Es realmente indefinido?
Como nota final que agrego a muchas de mis preguntas, estoy interesado en esto en el contexto del análisis estático. No estoy escribiendo esto solo, solo quiero saber si debería advertirlo en programas escritos por otros.
Para quien corresponda, "Siempre puedes intentarlo" nunca es una respuesta correcta a "¿Es X un comportamiento indefinido?". –
+1, pero también tenga en cuenta que UB no es necesariamente malo. C no prohíbe el uso de UB, simplemente dice "No sé lo que sucederá. Espero que lo hagas". – Philip
UB es malo. A diferencia del comportamiento definido por la implementación, el uso previsto para los autores del compilador es que el comportamiento puede cambiar y cambiará incluso entre diferentes versiones del mismo compilador, de acuerdo con lo que mejor sirva para la optimización del código válido. –