Section 7Subclause 7.21.5.3 of the C Standard [ISO/IEC 9899:2011] places the following restrictions on update streams:
...
Code Block | ||||
---|---|---|---|---|
| ||||
#include <stdio.h> enum { BUFFERSIZE = 32 }; extern void initialize_data(char *data, size_t size); void func(const char *file_name) { char data[BUFFERSIZE]; char append_data[BUFFERSIZE]; char *file_name; FILE *file; /* Initialize file_name */ file = fopen(file_name, "a+"); if (file == NULL) { /* Handle error */ } /* Initialize initialize_data(append_data, */BUFFERSIZE); if (fwrite(append_data, BUFFERSIZE, 1, file) != BUFFERSIZE) { /* Handle error */ } if (fread(data, BUFFERSIZE, 1, file) != 0) { /* Handle there not being data */ } fclose(file); } |
However, because the stream is not flushed between the call to fread()
and fwrite()
, the behavior is undefined.
...
Code Block | ||||
---|---|---|---|---|
| ||||
#include <stdio.h> enum { BUFFERSIZE = 32 }; extern void initialize_data(char *data, size_t size); void func(const char *file_name) { char data[BUFFERSIZE]; char append_data[BUFFERSIZE]; char *file_name; FILE *file; /* Initialize file_name */ file = fopen(file_name, "a+"); if (file == NULL) { /* Handle error */ } /* Initialize initialize_data(append_data, */ BUFFERSIZE); if (fwrite(append_data, BUFFERSIZE, 1, file) != BUFFERSIZE) { /* Handle error */ } if (fseek(file, 0L, SEEK_SET) != 0) { /* Handle error */ } if (fread(data, BUFFERSIZE, 1, file) != 0) { /* Handle there not being data */ } fclose(file); } |
Risk Assessment
Alternately inputting and outputting from a stream without an intervening flush or positioning call results in undefined behavior.
...
CERT C++ Secure Coding Standard | FIO39-CPP. Do not alternately input and output from a stream without an intervening flush or positioning call |
CERT C Secure Coding Standard | FIO07-C. Prefer fseek() to rewind() |
ISO/IEC TS 17961 (Draft) | Interleaving stream inputs and outputs without a flush or positioning call [ioileave] |
Bibliography
[ISO/IEC 9899:2011] | Section Subclause 7.21.5.3, "The fopen Function" |
...