The behavior when simultaneously opening a file multiple times is implementation defined. On some platforms, this is not allowed. On others, it might result in race conditions.
The following non-compliant code write logs about the programs state at runtime.
void do_stuff(void) {
FILE* logfile = fopen("log", "a");
/* Check for errors, write logs pertaining to do_stuff, etc. */
}
int main() {
FILE* logfile = fopen("log", "a");
/* Check for errors, write logs pertaining to main, etc. */
do_stuff()
/* ... */
}
|
However, it opens the file log twice simultaneously. As stated above, the result is implementation defined and dangerous.
In this compliant solution, a reference to the file pointer is passed around so that the file does not have to be opened twice separately.
void do_stuff(FILE **file) {
FILE* logfile = *file;
/* Check for errors, write logs pertaining to do_stuff, etc. */
}
int main() {
FILE* logfile = fopen("log", "a");
/* Check for errors, write logs pertaining to main, etc. */
do_stuff(&logfile)
/* ... */
}
|
Simultaneously opening a file multiple times could result in abnormal program termination or a data integrity violation.
Rule |
Severity |
Likelihood |
Remediation Cost |
Priority |
Level |
|---|---|---|---|---|---|
FIO08-A |
2 (medium) |
2 (probable) |
2 (medium) |
P8 |
L2 |
\[[ISO/IEC 9899-1999:TC2|AA. C References#ISO/IEC 9899-1999TC2]\] Section 7.19.3, "Files" |