Since std::basic_string is a container of characters, this rule is a specific instance of CTR51-CPP. Use valid references, pointers, and iterators to reference elements of a container. As a container, it supports iterators just like other containers in the Standard Template Library. However, the std::basic_string template class has unusual invalidation semantics. According to the The C++ Standard, [string.require], paragraph 5 [ISO/IEC 14882-2014], states the following:
References, pointers, and iterators referring to the elements of a
basic_stringsequence may be invalidated by the following uses of thatbasic_stringobject:
- As an argument to any standard library function taking a reference to non-const
basic_stringas an argument.- Calling non-const member functions, except
operator[],at,front,back,begin,rbegin,end, andrend.
...
Do not use an invalidated reference, pointer, or iterator because doing so results in undefined behavior.
...
In this noncompliant code example, data is invalidated after the call to replace(), and so its use in g() is undefined behavior:.
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <iostream>
#include <string>
extern void g(const char *);
void f(std::string &exampleString) {
const char *data = exampleString.data();
// ...
exampleString.replace(0, 2, "bb");
// ...
g(data);
} |
...
In this compliant solution, the pointer to exampleString's internal buffer is not generated until after the modification from replace() has completed:.
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <iostream>
#include <string>
extern void g(const char *);
void f(std::string &exampleString) {
// ...
exampleString.replace(0, 2, "bb");
// ...
g(exampleString.data());
} |
...
Using an invalid reference, pointer, or iterator to a string object could allow an attacker to run arbitrary code.
Rule | Severity | Likelihood |
|---|
Detectable | Repairable | Priority | Level |
|---|---|---|---|
STR52-CPP | High | Probable |
No | No | P6 | L2 |
Automated Detection
Tool | Version | Checker | Description |
|---|
| CodeSonar |
| ALLOC.UAF | Use After Free | ||||||
| Helix QAC |
| DF4746, DF4747, DF4748, DF4749 | |||||||
| Parasoft C/C++test |
| CERT_CPP-STR52-a | Use valid references, pointers, and iterators to reference elements of a basic_string | ||||||
| Polyspace Bug Finder |
| CERT C++: STR52-CPP | Checks for use of invalid string iterator (rule partially covered). | ||||||
| Security Reviewer - Static Reviewer | 6.02 | C24 | Fully implemented |
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
Related Guidelines
| SEI CERT C++ Coding Standard | CTR51-CPP. Use valid references, pointers, and iterators to reference elements of a container |
Bibliography
| [ISO/IEC 14882-2014] | Subclause 21.4.1, " |
| [Meyers |
| 2001] | Item 43, "Prefer Algorithm Calls to Hand-written Loops" |
...
...