2013/9/4 Paul Pluzhnikov <ppluzhni...@google.com>: > Greetings, > > This is a followup to: > http://gcc.gnu.org/ml/libstdc++/2013-08/msg00096.html > > Without this patch, the user on vector::at out of bounds sees: > > terminate called after throwing an instance of 'std::out_of_range' > what(): vector::_M_range_check > Aborted (core dumped) > > With the patch: > > terminate called after throwing an instance of 'std::out_of_range' > what(): vector::_M_range_check: __n (which is 3) >= this->size() (which is > 2) > Aborted (core dumped) > > > I am not at all sure the names I choose here are good ones. Suggestions > welcome. > > I also shudder at the idea of repeating _M_range_check code in > e.g. string::at(), and elsewhere. Perhaps we need a snprintf_lite, that > only understands '%zu' and literal characters, e.g.:
I expect that this kind of index violation is a rather often occurring pattern and should be isolated. IMO the _M_range _check now pessimisms the normal, non-violating case. Why not simply replacing it by something along the lines of _M_range_check(size_type __n) const { if (__n >= this->size()) __throw_out_of_range(__index_out_of_range_msg(__N("vector::_M_range_check"), __n, this->size())); } where __index_out_of_range_msg is a reusable function that uses something like snprintf_lite internally? - Daniel