...
The std::condition_variable::wait()
function has an overloaded form that accepts a function object representing the predicate. This form of wait()
behaves as if it were implemented as while (!pred()) wait(lock);
. This compliant solution uses a lambda as a predicate and passes it to the wait()
function. The predicate is expected to return true when it is safe to proceed, which reverses the predicate logic from the compliant solution using an explicit loop predicate.
...
Failure to enclose calls to the wait()
, wait_for()
, or wait_until()
member functions inside a while
loop can lead to indefinite blocking and denial of service (DoS).
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
CON54-CPP | Low | Unlikely | Medium | P2 | L3 |
Automated Detection
Tool | Version | Checker | Description | ||||||
---|---|---|---|---|---|---|---|---|---|
CodeSonar |
| LANG.STRUCT.ICOL | Inappropriate Call Outside Loop | ||||||
Helix QAC |
| C++5019 | |||||||
Klocwork |
| CERT.CONC.WAKE_IN_LOOP | |||||||
Parasoft C/C++test |
| CERT_CPP-CON54-a | Wrap functions that can spuriously wake up in a loop | ||||||
Polyspace Bug Finder |
| CERT C++: CON54-CPP | Checks for situations where functions that can spuriously wake up are not wrapped in loop |
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
Related Guidelines
Bibliography
[ISO/IEC 9899:2011] | 7.17.7.4, "The atomic_compare_exchange Generic Functions" |
[Lea 2000] | 1.3.2, "Liveness" |
...
...