如何在C ++中使用数组导致安全问题

时间:2009-05-20 07:56:13

标签: c++ security

有人告诉我,用C ++编程的最佳方法是使用STL和字符串而不是数组和字符数组。

即,

vector<int> myInt;

而不是

int myInt[20]

但是,我不明白为什么会导致安全问题的理性。

5 个答案:

答案 0 :(得分:9)

我建议您在buffer overruns上阅读。当使用原始数组时,程序员更有可能创建或冒险缓冲区溢出,因为它们为您提供较少的保护并且不提供API。当然,使用STL也可以用脚射击自己,但至少它更难。

答案 1 :(得分:4)

这里似乎存在一些关于安全向量能够和不能提供什么的混淆。忽略迭代器的使用,在向量中访问元素有三种主要方式。

  • vector的operator []函数 - 这不提供边界检查和将 导致绑定错误的未定义行为,就像使用无效索引时数组一样。

  • at()向量成员函数 - 这提供了边界检查,如果使用了无效索引,将以很小的性能成本引发异常

  • 向量的基础数组的C ++运算符[] - 它不提供边界检查,但提供尽可能高的访问速度。

答案 2 :(得分:2)

数组不执行绑定检查。因此,他们非常容易受到bound checking errors的攻击,而这很难被发现。

注意:以下代码存在编程错误。

int Data[] = { 1, 2, 3, 4 };
int Sum = 0;

for (int i = 0; i <= 4; ++i) Sum += Data[i];

使用这样的数组,你不会得到一个可以帮助你找到错误的异常;只有不正确的结果。

数组不知道自己的大小,而vector定义beginend方法来访问其元素。使用数组你总是必须依赖指针算术(因为它们只是指针,你可以意外地投射它们)

答案 3 :(得分:1)

C ++数组在插入或读取时不执行边界检查,并且很容易意外地从数组边界外部访问项目。

从OO的角度来看,载体也有更多关于自身的知识,因此可以照顾自己的家务。

答案 4 :(得分:0)

您的示例包含一个具有固定数量项的静态数组;根据您的算法,这可能与具有固定数量项目的向量一样安全。

但是,根据经验,当您想要动态分配项目数组时,矢量会更容易,也可以减少错误。每当你不得不思考时,就有可能出现一个可能被利用的错误。