【问题标题】:Buffer Overrun using a Vector使用向量的缓冲区溢出
【发布时间】:2020-05-09 20:30:53
【问题描述】:
unsigned short* myClass::get_last(size_t _last) const
{
    if (_last == 0) _last = last.size();
    if (_last <= last.size())
    {
        unsigned short* temp = new unsigned short [_last] {};
        while (_last > 0) temp[_last] = last[last.size() - _last--]; //I get a warning HERE
        return temp;
    }
    throw std::runtime_error("Error!");
}

上面写着:

写入“temp”时缓冲区溢出:可写大小为“_last*2” 字节,但可能会写入“_last”字节。

这是什么意思?我确定 _last 不大于 temp.size() 因为if 所以我该怎么办?

它在运行时完美运行,但我讨厌让其他用户或我将来无法理解我的代码的警告。


编辑: _last 是用户在运行时给出的参数,因此它最终可能具有任何值,但如果他的值超出范围,则会出现异常(在另一个函数中管理)。

我在标题中提到的向量是last,它是myClass的成员。

我知道数组的元素从 0_last - 1,这就是为什么我在使用它之前递减 _last第一次(你可能知道赋值关联性是从右到左的)。


我希望我回答了你所有的 cmets ;)

【问题讨论】:

  • 你是如何使用这个功能的? _last 有什么价值?什么是last,它是如何初始化的?请尝试创建minimal reproducible example 向我们展示。也请花一些时间阅读how to ask good questions,以及this question checklist
  • temp_last 元素的数组,然后您写入temp[_last]。你知道 C++ 中的数组索引从 0 开始吗​​?这样有效索引从 0 变为 _last-1?
  • 问题标题承诺的向量在哪里?
  • 为什么我感觉这段代码正在做一些使用标准库容器可以轻松完成的事情?
  • 好的我编辑了我的帖子,希望它更容易理解

标签: c++ buffer overrun


【解决方案1】:

问题在于 C++ 索引数组从 0 开始。因此大小为 4 的数组具有有效的索引 0、1,2 和 3。

但是你分配了一个大小为 _last 的数组:

unsigned short* temp = new unsigned short [_last] {};

然后写信给temp[_last]。这超出了数组的大小。

【讨论】:

  • 我已经验证了 _last 不能大于 temp size 这里if (_last &lt;= last.size())
  • 是的。但它必须更小。数组从 0 变为 size - 1。
【解决方案2】:

使用向量解决!

std::vector<unsigned short> Tombola::get_last(size_t _last) const
{
    if (_last == 0) _last = last.size();
    if (_last <= last.size())
    {
        std::vector<unsigned short> temp(_last);
        while (_last > 0) temp[_last] = last[last.size() - _last--];
        return temp;
    }
    throw std::runtime_error("Error!");
}

出于某种原因,即使您不知道如何解决,它们也​​总是能解决所有问题;)

【讨论】:

  • 这不是答案,只是评论。
  • 除了向量会根据需要自动调整大小之外,还有缓冲区溢出。效率低下,因为您分配了两次向量。
  • @GoswinvonBrederlow 事实是它实际上并没有缓冲区溢出,因为我在第 4 行检查了它的大小,但编译器没有意识到这一点,因为我将我的内容分配在另一个向量上,该向量具有永远不会大于last size的大小
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 2013-11-06
相关资源
最近更新 更多