我是海湾合作委员会的忠实粉丝,但最近我注意到一个模糊的异常现象.使用__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)
取消引用迭代器超出获取它的容器的末尾是未定义的行为,并且什么都不做就是那里的可能性.
请注意,这是一个妥协的问题,让迭代器检查开发的有效性是很好的,但这会给代码增加额外的操作.默认情况下,在MSVS迭代器中进行检查(它们将验证它们是否有效并在以错误方式使用时失败=.但这也会对运行时性能产生影响.
Dinkumware(VS内部的STL)提供的解决方案(默认选中,可以通过编译器选项取消选中)实际上是一个不错的选择,用户选择是否需要缓慢安全的迭代器或快速不安全的版本.但从语言的角度来看,两者都是有效的.
归档时间: |
|
查看次数: |
868 次 |
最近记录: |