You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 6 Next »

The index operators:

const_reference operator[](size_type pos) const;
reference operator[](size_type pos);

return the character stored at the specified position if pos < size(). If pos == size(), the const
version returns the terminating null character type value. Otherwise, the behavior is undefined.

In any case, the behavior of the index operators is unchecked (no exceptions are thrown).

Non-Compliant Example

The behavior of this non-compliant example is undefined becuase the size() of bs is 8 but the index used to reference bs ranges from 0 through 99.

string bs("01234567");
for (int i=0; i<100; i++) {
  bs[i] = '\0'';
}

This program does not typically raise an exception and is likely to crash.

Compliant Solution

The following compliant solution uses the basic_string at() method which behaves in a similar fashion to the index operator[] but throws an out_of_range if pos >= size().

string bs("01234567");
try {
  for (int i=0; i<100; i++) {
    bs.at(i) = '\0';
  }
}
catch (...) {
  cerr << "Index out of range" << endl;
}

Consequences

Unchecked element access can lead to out-of-bounds read and writes and write-anywhere exploits. These exploits can in turn lead to the execution of arbitrary code with the permissions of the vulnerable process.

References

  • No labels