Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 29 Sep 1998 16:14:51 +0400
From:      Dmitrij Tejblum <tejblum@arc.hq.cti.ru>
To:        Bruce Evans <bde@zeta.org.au>
Cc:        dg@root.com, shmit@kublai.com, wb@yorikke.arb-phys.uni-dortmund.de, freebsd-bugs@FreeBSD.ORG
Subject:   Re: bin/7742: fclose(3) dumps core on NULL 
Message-ID:  <199809291214.QAA23755@arc.hq.cti.ru>
In-Reply-To: Your message of "Tue, 29 Sep 1998 09:47:01 %2B1000." <199809282347.JAA18084@godzilla.zeta.org.au> 

next in thread | previous in thread | raw e-mail | index | archive | help
Bruce Evans wrote:
> >Why is free(NULL) permissable, but not fclose(NULL)?
> 
> Because the C standard says so.

Well, a program calling fclose(NULL) is non-conforming. And what? A lot of 
non-conforming programs work on FreeBSD. Anyhow, the behavior of 
printf("%s", (char*)NULL) is not defined by the standard too, but on 
FreeBSD this print "(null)" rather than dumps core. IMO, this is far more 
bogus, and I'd rather remove this feature.

Anyway, fclose(NULL) is not like strlen(NULL) or fprintf(NULL, ...). 
fclose(NULL) is like free(NULL), and I claim that it is in the spirit of C 
if fclose(NULL) permitted :-| :-|. (It is definitely in the spirit of C++, 
and the standard C library is a part of the standard C++ library.)

Note that FreeBSD is apparently the only modern Unix that doesn't permit 
fclose(NULL), thus the programmer doesn't need to "know about this problem":
fixing his code doesn't buy him portability to anything else. This "problem" 
is FreeBSD-specific in practice, and we should remove it as such. (*)
Also, it is irrelevant that programmers don't test result of fclose(NULL).
fclose(NULL) simple should not be considered as a bug, just like free(NULL).

Appendix. OS comparison.
                          FreeBSD     Linux   Solaris     OSF/1
                                       N/A      2.5        3.0

fclose(NULL)               core        work     work       work
fprintf(NULL, "Hi")        core        work     core       core
printf("%s", (char*)NULL)  work        work     core       work

IMO, Solaris' behavior is (most) correct.

Dima

(*) Apparently, most (or all) Windows compilers do not permit fclose(NULL). 
It is totally irrelevant, though. :-)





To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199809291214.QAA23755>