...
In this compliant solution, fseek() is called between the output and input, eliminating the the undefined behavior 156:
| 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];
FILE *file;
file = fopen(file_name, "a+");
if (file == NULL) {
/* Handle error */
}
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 */
}
if (fclose(file) == EOF) {
/* Handle error */
}
} |
...
Alternately inputting and outputting from a stream without an intervening flush or positioning call is undefined behavior 156.
Rule | Severity | Likelihood | Detectable | RepairableRemediation Cost | Priority | Level |
|---|---|---|---|---|---|---|
FIO39-C | Low | Likely | Yes | MediumNo | P6 | L2 |
Automated Detection
Tool | Version | Checker | Description | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Astrée |
| Supported, but no explicit checker | ||||||||
| Axivion Bauhaus Suite |
| CertC-FIO39 | ||||||||
| CodeSonar |
| IO.IOWOP | Input After Output Without Positioning | |||||||
| Compass/ROSE | Can detect simple violations of this rule | |||||||||
| Cppcheck |
| IOWithoutPositioningFully implemented | ||||||||
| Cppcheck Premium |
| IOWithoutPositioning | Fully implemented | |||||||
| Helix QAC |
| DF4711, DF4712, DF4713 | ||||||||
| Klocwork |
| CERT.FIO.NO_FLUSH | ||||||||
| LDRA tool suite |
| 84 D | Fully implemented | |||||||
| Parasoft C/C++test |
| CERT_C-FIO39-a | Do not alternately input and output from a stream without an intervening flush or positioning call | |||||||
| PC-lint Plus |
| 2478, 2479 | Fully supported | |||||||
| CERT C: Rule FIO39-C | Checks for alternating input and output from a stream without flush or positioning call (rule fully covered) | ||||||||
| C17 C77 C78 C79 C80 | Fully implemented |
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
...
CWE-664 = Union( FIO39-C, list) where list =
- Improper use of an object (besides alternating reading/writing a file stream without an intervening flush
This CWE is vague on what constitutes “improper control of a resource”. It could include any violation of an object’s method constraints (whether they are documented or not). Or it could be narrowly interpreted to mean object creation and object destruction (which are covered by other CWEs).
...