Versions Compared

Key

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

Some functions in the C standard library are not guaranteed to be reentrant with respect to threads. Some functions (such as strtok() and asctime()) return a pointer to the result stored in function-allocated memory on a per-process basis. Other functions (such as rand()) store state information in function-allocated memory on a per-process basis. Multiple threads invoking the same function can cause concurrency problems, which often result in abnormal behavior and can cause more serious vulnerabilities, such as abnormal termination, denial-of-service attack, and data integrity violations.

...

Consider a multithreaded application that encounters an error while calling a system function. The strerror() function returns a human-readable error string given an error number. According to C99, Section 7.22.6.2, specifically states that strerror() is not required to avoid data races. Conventionally, it could rely on a static array that maps error numbers to error strings, and that array might be accessible and modifiable by other threads.

...

Note that this code first sets errno to 0 to comply with rule ERR30-C. Set errno to zero before calling a library function known to set errno, and check errno only after the function returns a value indicating failure.

...

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

CON33-C

medium

probable

high

P4

L3

Other Languages

Related Guidelines

CERT This rule appears in the C++ Secure Coding Standard as : CON03-CPP. Avoid assuming functions are thread-safe unless otherwise specified.

Automated Detection

...

Tool

Version

Checker

Description

Section

Compass/ROSE

 

 

Section

a module written in Compass/ROSE can detect violations of this rule

...

Bibliography

Wiki Markup
\[[N1401-C1X Draft|http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1401.pdf]\] Section 7.21.2.1 rand() function, Section 7.21.4.6 getenv() function, Section 7.22.5.8 strtok() function, Section 7.22.6.2 strerror() function, Section 7.25.3.1 asctime() function, Section 7.25.3.2 ctime() function
\[[Historical information about POSIX.1 Thread Safety|http://www.unix.org/whitepapers/reentrant.html]\]

...