使用C++迭代器引用无效的内存位置

the*_*ine 3 c++ memory gcc

我是海湾合作委员会的忠实粉丝,但最近我注意到一个模糊的异常现象.使用__gnu_cxx :: __ normal_iterator(即libstdc ++中使用的最常用的迭代器类型,C++ STL),可以引用任意内存位置,甚至可以更改其值而不会导致异常!这是预期的行为吗?如果是这样,是不是一个安全漏洞?

这是一个例子:

#include <iostream>
using namespace std;

int main() {
        basic_string<char> str("Hello world!");
        basic_string<char>::iterator iter = str.end();



        iter += str.capacity() + 99999;
        *iter = 'x';

        cout << "Value: " << *iter << endl;
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*eas 6

取消引用迭代器超出获取它的容器的末尾是未定义的行为,并且什么都不做就是那里的可能性.

请注意,这是一个妥协的问题,让迭代器检查开发的有效性是很好的,但这会给代码增加额外的操作.默认情况下,在MSVS迭代器中进行检查(它们将验证它们是否有效并在以错误方式使用时失败=.但这也会对运行时性能产生影响.

Dinkumware(VS内部的STL)提供的解决方案(默认选中,可以通过编译器选项取消选中)实际上是一个不错的选择,用户选择是否需要缓慢安全的迭代器或快速不安全的版本.但从语言的角度来看,两者都是有效的.