Defect Report #045
Submission Date: 10 Dec 92
Submittor: WG14
Source: X3J11/92-036 (David J. Hendricksen)
Question 1
Under subclause 7.9.5.4 The freopen function, the C Standard
states on page 130, lines 24-29:
The freopen function opens the file whose name is the
string pointed to by filename and associates the stream pointed
to by stream with it. The mode argument is used just as
in the fopen function.
The freopen function first attempts to close any file
that is associated with the specified stream. Failure to close the
file successfully is ignored. The error and end-of-file indicators
for the stream are cleared.
It is not clear whether the following situations have defined behavior:
- Calling freopen where stream points to uninitialized
storage. For example:
{ FILE a, *b;
b = freopen("c.d", "r", &a);
}
(It may not be possible to detect that the information contained
within a is not valid when the close for freopen is attempted.)
- Calling freopen where stream is associated with
a previously closed file. (The storage pointed to by stream
may have been deallocated.)
Response
The behavior is undefined in both cases; case (2) is clear from subclause
7.9.3 Files, page 126, lines 24-27, ``A file may be disassociated
from a controlling stream by closing the file... The value
of a pointer to a FILE object is indeterminate after the associated
file is closed (including the standard text streams).'' Also subclause
7.9.3 Files, page 126, lines 2-3 and lines 37-39, ``A stream
is associated with an external file... by opening a file, ...
At program startup, three text streams are predefined and need not
be opened explicitly...'' Also subclause 7.9.5.3 The fopen
function, and, similarly, subclause 7.9.5.4 The freopen
function: ``The ... function opens the file ... and associates
a stream with it...'' Thus when subclause 7.9.5.4 says ``The
freopen function ... associates the stream pointed to by stream
with it,'' the intention is certainly that stream already
points to a valid stream. Extending this to case (1), we observe that
a (or &a) might not refer to a stream, since none has
been ``associated'' by any means specified in the C Standard.
Previous Defect Report
< - >
Next Defect Report