GitHub
CERT Secure Coding

FIO11-C. Take care when specifying the mode parameter of fopen()

The C Standard identifies specific strings to use for the mode on calls to fopen() and fopen_s() . C11 provides a new mode flag, x , that provides the mechanism needed to determine if the file that is to be opened exists. To be strictly conforming and portable, one of the strings from the following table (adapted from the C Standard, subclause 7.21.5.2 [ ISO/IEC 9899:2011 ]) must be used:

Strings to Use for the Mode on Calls to fopen() and fopen_s()

mode StringResult
rOpen text file for reading
wTruncate to zero length or create text file for writing
wxCreate text file for writing
aAppend; open or create text file for writing at end-of-file
rbOpen binary file for reading
wbTruncate to zero length or create binary file for writing
wbxCreate binary file for writing
abAppend; open or create binary file for writing at end-of-file
r+Open text file for update (reading and writing)
w+Truncate to zero length or create text file for update
w+xCreate text file for update
a+Append; open or create text file for update, writing at end-of-file
r+b or rb+Open binary file for update (reading and writing)
w+b or wb+Truncate to zero length or create binary file for update
w+bx or wb+xCreate binary file for update
a+b or ab+Append; open or create binary file for update, writing at end-of-file

If the mode string begins with one of these sequences, the implementation might choose to ignore the remaining characters, or it might use them to select different kinds of files.

When calling fopen_s() , any of the mode strings used for writing ( w or a ) may be prefixed with the u character to give the file system default access permissions.

An implementation may define additional mode strings, but only the modes shown in the table are fully portable and C compliant. Beware that Microsoft Visual Studio 2012 and earlier do not support the x or u mode characters [ MSDN ].

Risk Assessment

Using a mode string that is not recognized by an implementation may cause the call to fopen() to fail.

Recommendation Severity Likelihood Detectable Repairable Priority Level
FIO11-C Medium Probable No No P4 L3

Automated Detection

Tool

Version

Checker

Description

Astrée
25.10

fopen-mode
fopen-s-mode

Partially checked
Compass/ROSE




LDRA tool suite
9.7.1

590 S

Partially implemented

PC-lint Plus

1.4

2472, 2473

Fully supported

Polyspace Bug Finder

R2025b

CERT C: Rec. FIO11-C

Checks for bad file access mode or status (rec. fully covered)

RuleChecker

25.10

fopen-mode
fopen-s-mode

Partially checked

Search for vulnerabilities resulting from the violation of this rule on the CERT website .

SEI CERT C++ Coding StandardVOID FIO11-CPP. Take care when specifying the mode parameter of fopen()

Bibliography

[ ISO/IEC 9899:2011 ]Subclause 7.21.5.3, "The fopen Function"