Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Wiki Markup
The formatted IO functions {{fprintf()}}, {{printf()}}, {{sprintf()}}, {{snprintf()}}, {{vfprintf()}}, {{vprintf()}}, {{vsprintf()}}, and {{vsnprintf()}} convert, format, and print their arguments under control of a _format_ string. According to \[[ISO/IEC 9899:1999|AA. Bibliography#ISO/IEC 9899-1999|Programming Languages---C]\]:

The format is a character string, beginning and ending in its initial shift state, if any. The format is composed of zero or more directives: ordinary characters, which are simply copied to the output stream, and conversion specifications, each of which shall result in the fetching of zero or more arguments.

...

Common mistakes in creating format strings include:

  • providing insufficient arguments for the format string
  • using invalid conversion specifiers
  • using a flag character that is incompatible with the conversion specifier
  • using a length modifier that is incompatible with the conversion specifier
  • mismatching the argument type and conversion specifier
  • using an argument of type other than int for width or precision

...

Conversion
Specifier
Character

' XSI

-
{+}
SPACE


#


0

 


h


hh


l


ll


j


z


t


L

Argument
Type

d, i

(tick)

(tick)

(error)

(tick)

 

short

char

long

long long

intmax_t

size_t

ptrdiff_t

(error)

signed integer

o

(error)

(tick)

(tick)

(tick)

 

short

char

long

long long

intmax_t

size_t

ptrdiff_t

(error)

unsigned integer

u

(tick)

(tick)

(error)

(tick)

 

short

char

long

long long

intmax_t

size_t

ptrdiff_t

(error)

unsigned integer

x

(error)

(tick)

(tick)

(tick)

 

short

char

long

long long

intmax_t

size_t

ptrdiff_t

(error)

unsigned integer

X

(error)

(tick)

(tick)

(tick)

 

short

char

long

long long

intmax_t

size_t

ptrdiff_t

(error)

unsigned integer

f, F

(tick)

(tick)

(tick)

(tick)

 

(error)

(error)

N/E

N/E

(error)

(error)

(error)

long double

double or long double

e, E

(error)

(tick)

(tick)

(tick)

 

(error)

(error)

N/E

N/E

(error)

(error)

(error)

long double

double or long double

g, G

(tick)

(tick)

(tick)

(tick)

 

(error)

(error)

N/E

N/E

(error)

(error)

(error)

long double

double or long double

a, A

(tick)

(tick)

(tick)

(tick)

 

(error)

(error)

N/E

N/E

(error)

(error)

(error)

long double

double or long double

c

(error)

(tick)

(error)

(error)

 

(error)

(error)

wint_t

(error)

(error)

(error)

(error)

(error)

int or wint_t

s

(error)

(tick)

(error)

(error)

 

(error)

(error)

NTWS

(error)

(error)

(error)

(error)

(error)

NTBS or NTWS

p

(error)

(tick)

(error)

(error)

 

(error)

(error)

(error)

(error)

(error)

(error)

(error)

(error)

void*

n

(error)

(tick)

(error)

(error)

 

short*

char*

long*

long long*

intmax_t*

size_t*

ptrdiff_t*

(error)

pointer to integer

C XSI

(error)

(tick)

(error)

(error)

 

(error)

(error)

(error)

(error)

(error)

(error)

(error)

(error)

wint_t

S XSI

(error)

(tick)

(error)

(error)

 

(error)

(error)

(error)

(error)

(error)

(error)

(error)

(error)

NTWS

%

(error)

(tick)

(error)

(error)

 

(error)

(error)

(error)

(error)

(error)

(error)

(error)

(error)

none

Legend:

  • SPACE – the SPACE—the space (' ') character
  • _N/E – No _—No Effect
  • NTBS – NTBS—char* argument pointing to a Null-Terminated Byte String
  • NTWS – NTWS—wchar_t* argument pointing to a Null-Terminated Wide character String
  • XSI – XSI—ISO/IEC 9945-2003 XSI extension

...

The width and precision arguments to printf() format directives must be of type int. According to C99:

A field width, or precision, or both, may be indicated by an asterisk ('*'). In this case an argument of type int supplies the field width or precision.

...

Recommendation

Severity

Likelihood

Remediation Cost

Priority

Level

FIO00-C

high

unlikely

medium

P6

L2

Automated Detection

Section

...

...

Include Page
c:LDRA_V
c:LDRA_V

 

 

Section

GCC

Include Page
c:GCC_V
c:GCC_V

 

Section

can detect violations of this recommendation when the -Wformat flag is used

...

Section

Klocwork

Include Page
c:Klocwork_V
c:Klocwork_V
Section

SV.FMT_STR.

...

 

Related Vulnerabilities

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

Other Languages

Related Guidelines

CERT This rule appears in the C++ Secure Coding Standard as : FIO00-CPP. Take care when creating format strings.

Bibliography

unmigrated-wiki-markup

\[[ISO/IEC 9899:1999|AA. Bibliography#ISO/IEC 9899-1999]\] Section 7.19.6.1, "The {{fprintf}} function" \[[MITRE 07|AA. Bibliography#MITRE 07]\] [CWE ID 686|http://cwe.mitre.org/data/definitions/686.html], "Function Call With Incorrect Argument Type"

MITRE CWE: CWE-686, "Function Call With Incorrect Argument Type"

Bibliography

...

FIO19-C. Do not use fseek() and ftell() to compute the size of a file      09. Input Output (FIO)