Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向量的缓冲区溢出_C++_Stdvector_Buffer Overflow - Fatal编程技术网

C++ 向量的缓冲区溢出

C++ 向量的缓冲区溢出,c++,stdvector,buffer-overflow,C++,Stdvector,Buffer Overflow,我正在尝试创建一个缓冲区溢出保护程序,我正在考虑使用stl向量,但我已经了解到,这仍然不会执行边界检查,仍然可能被黑客攻击。我主要关心的是重写程序中的返回、函数调用或其他变量。在这种情况下,向量有效吗 您可以这样声明一个向量 std::vector<int> v; 通常在向std::vector添加元素时,使用push_back或emplace_back,而不是直接访问元素 v.push_back(0); // v is now 1 element long: { 0 } v

我正在尝试创建一个缓冲区溢出保护程序,我正在考虑使用stl向量,但我已经了解到,这仍然不会执行边界检查,仍然可能被黑客攻击。我主要关心的是重写程序中的返回、函数调用或其他变量。在这种情况下,向量有效吗

您可以这样声明一个向量

std::vector<int> v;
通常在向std::vector添加元素时,使用push_back或emplace_back,而不是直接访问元素

v.push_back(0);    // v is now 1 element long: { 0 }
v.emplace_back(1); // v is now 2 elements long: { 0 , 1 }
使用[]运算符确实会为您提供对基础项的引用,因此您可以将其用于检索和分配,只要您确定索引有效。您可以使用size函数来确定适当的max元素索引是什么,它的大小为-1

或基于范围的for循环,因为它提供开始和结束函数

// prints the elements in the vector
for (const auto& elem : v)
    std::cout << elem << " ";
std::cout << "\n";
有可能会溢出std::vector缓冲区,但如果遵循规则,则不太可能。一个std::vector比一个数组好,所以如果你不介意你的元素存在于大多数非高性能应用程序的免费存储中,那就去吧。易用性和灵活性非常值得额外的开销

此外,由于在堆栈上放置本地数组时,std::vector中的数据不存在于堆栈上,因此如果超出std::vector,则不太可能覆盖堆栈。如果幸运的话,您的程序将崩溃,但不要依赖于此

总之,std::vector可能会有缓冲区溢出,但它的接口使其很难做到这一点。如果您确实超出了它的缓冲区,您将覆盖空闲存储区中的数据,而不是堆栈上的数据,因此您不会修改返回地址。虽然免费存储中的第二项可能会被向量缓冲区溢出写入,但我认为这是不确定的。而任何有权使用数组访问源代码的人都可以轻松确定哪些输入会产生堆栈覆盖(如果有的话)


有关std::vector接口的更多信息,请参阅。

我已经了解到,如果您使用它,它仍然不会执行边界检查。atI不完全确定您在这里提出的问题。如果编译器在编译时检测到超出范围的索引,是否希望编译器发出警告?或者,当试图访问向量范围之外的索引时,是否希望在运行时抛出超出范围的异常?如果代码中有错误,任何代码都可能被破解。使用带有边界检查的容器会有所帮助,但如果这正是您需要的,它并不能神奇地使您的代码不受黑客攻击。
for (std::size_t i = 0; i < v.size(); ++i)
{
    v[i] = 10;
}
// v was size 2, we've replaced both elements at 0 and 1 with value 10
// prints the elements in the vector
for (auto it = v.begin(); it != v.end(); ++it)
   std::cout << *it << " ";
std::cout << "\n";
// prints the elements in the vector
for (const auto& elem : v)
    std::cout << elem << " ";
std::cout << "\n";