According to the C Standard, 7.21.3, paragraph 6 [ISO/IEC 9899:2011],

The address of the FILE object used to control a stream may be significant; a copy of a FILE object need not serve in place of the original.

Consequently, do not copy a FILE object.

Noncompliant Code Example

This noncompliant code example can fail because a by-value copy of stdout is being used in the call to fputs():

#include <stdio.h>
 
int main(void) {
  FILE my_stdout = *stdout;
  if (fputs("Hello, World!\n", &my_stdout) == EOF) {
    /* Handle error */
  }
  return 0;
}

When compiled under Microsoft Visual Studio 2013 and run on Windows, this noncompliant example results in an "access violation" at runtime.

Compliant Solution

In this compliant solution, a copy of the stdout pointer to the FILE object is used in the call to fputs():

#include <stdio.h>
 
int main(void) {
  FILE *my_stdout = stdout;
  if (fputs("Hello, World!\n", my_stdout) == EOF) {
    /* Handle error */
  }
  return 0;
}

Risk Assessment

Using a copy of a FILE object in place of the original may result in a crash, which can be used in a denial-of-service attack.

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

FIO38-C

Low

Probable

Medium

P4

L3

Automated Detection

ToolVersionCheckerDescription
Astrée
file-dereferencePartially checked
Axivion Bauhaus Suite

CertC-FIO38Fully implemented
Clang
misc-non-copyable-objectsChecked with clang-tidy
Compass/ROSE

Can detect simple violations of this rule

Coverity

MISRA C 2012 Rule 22.5

Partially implemented
LDRA tool suite

591 S

Fully implemented
Parasoft C/C++test

CERT_C-FIO38-a

A pointer to a FILE object shall not be dereferenced

Polyspace Bug Finder

CERT C: Rule FIO38-CChecks for misuse of a FILE object (rule fully covered)
PRQA QA-C

1485, 5028
PRQA QA-C++
5013
RuleChecker

file-dereference

Partially checked

Related Vulnerabilities

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

Related Guidelines

Key here (explains table format and definitions)

Taxonomy

Taxonomy item

Relationship

ISO/IEC TS 17961:2013Copying a FILE object [filecpy]Prior to 2018-01-12: CERT: Unspecified Relationship

Bibliography

[ISO/IEC 9899:2011]7.21.3, "Files"