Flash Gordon <spam@flash-gordon.me.uk> writes:
> Keith Thompson wrote, On 19/10/07 07:29:
>> Ben Pfaff <blp@cs.stanford.edu> writes:
>>> CBFalconer <cbfalconer@yahoo.com> writes:
>>>> int fcopy(char const *dst, char const *src) {
>>>> FILE *sf, *df;
>>>> int ch
>>>>
>>>> if (sf = fopen(src, "r") { /* text files */
>>>> if (df = fopen(dst, "w") {
>>>> while (EOF != (ch = getc(sf))) putc(ch, df);
>>>> fclose(df);
>>>> }
>>>> fclose(sf);
>>>> }
>>>> return sf && df; /* non-zero for success */
>>> I think that this is a bad idea: it is a lot like checking the
>>> value of a pointer after it has been freed (often fclose will
>>> actually call free on the stream, in fact). I'm sure it works in
>>> practice on almost every implementation though.
>>>
>>>> }
>> If the first fopen() fails, no value is assigned to df, and accessing
>> it invokes undefined behavior.
>
> If the first fopen fails sf will be a null pointer and short circuit
> evaluation ensures that df is not accessed, so it is OK.
[...]
You're right.
--
Keith Thompson (The_Other_Keith)
kst-u@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"