On Mon, Jan 04, 2021 at 08:48:55PM +0100, Otto Moerbeek wrote: > On Mon, Jan 04, 2021 at 05:50:53PM +0100, Otto Moerbeek wrote: > > > tOn Mon, Jan 04, 2021 at 01:42:48PM +0100, Theo Buehler wrote: > > > > > > > + return log_sockaddr(addr2sa(addr, 0, &len), len); > > > > > > > > Perhaps I haven't yet had enough coffee this year, but I'm unsure > > > > whether it is actually guaranteed that addr2sa() is called before the > > > > second len in this line is passed to log_sockaddr(). > > > > > > Answering my own question: C99 and C11 6.5.2.2.12 require that all side > > > effects must be completed before log_sockaddr() is called. As addr2sa() > > > changes the second len as a side effect, this should be fine. > > > > > > ok tb > > > > > > > I am not convinced. Consider > > > > #include <stdio.h> > > > > char x; > > > > char f(char *p) > > { > > *p = 'f'; > > return 'r'; > > } > > > > int main() > > { > > x = 'm'; > > printf("%c %c %c\n", x, f(&x), x); > > } > > > > prints "m r f" here. The first x is not influenced by the call to > > f(), while the second is. So the side effetc only affects one of the args. > > > > -Otto > > > > > > And if you compile with gcc on amd64 you'll get "f r m". > > In my reading, the C standard is clear; the order of evaluation of the > arguments is undefined. The side effects should indeed take effect > before calling the function, but that's something different, e.g. > before the side effetcs are complete, some of the args may already be > on the stack,
Yes. Thanks for the example and the clarifications. I agree that the spec is clear that the order is unspecified. I fooled myself into thinking the identity function should somehow be special. Anyway, this will be fixed by claudio's follow-up on tech.