我该如何修复此缓冲区溢出问题?

时间:2018-01-03 14:36:15

标签: c++ winapi stdvector

我最近在正在使用HP fortify的项目上运行了代码扫描。 据报道,我对ReadFile存在严重问题。 我从不传递空缓冲区。 有关如何解决潜在缓冲区溢出问题的任何建议。

摘要

serialport.cpp中的函数Read()可能能够在第225行的已分配内存的边界外写入,这可能会破坏数据,导致程序崩溃或导致恶意代码的执行。

throw error

2 个答案:

答案 0 :(得分:0)

  

我从不传递空缓冲区

但有一天可能会有其他人。你知道你在函数之外做了什么,你错误地在函数内部评估代码​​。该功能可以传递空std::vector<char> &。总有一天,成为。处理那个案子。

答案 1 :(得分:0)

您永远不会传递空缓冲区,但代码扫描工具不知道这一点。我与之合作过的只关注单个函数,因此假设实际参数可以是任何函数。

如果缓冲区为空,则&buffer[0]是未定义的行为。您已尝试创建指向不存在的内存的指针。这可能是代码扫描工具的反应。

尽管&buffer[0]是一个无效的指针,但您可能会发生任何错误,因为没有任何内容可以访问它。但是buffer[0]本身就是一种无效的访问,即使您没有阅读或写入该元素。

虽然您可能会使用buffer.data()而躲开,但我仍然对此保持警惕。它似乎只是为非空数组定义。

要解决问题,...

选项1:将assert(!buffer.empty());添加到函数的开头。

选项2:更仔细地获取指针,

DWORD read = 0;
char trash;
void *pBuffer = buffer.empty() ? &trash : buffer.data();
int val = ReadFile(h, pBuffer, buffer.size(), &read, NULL);

虽然该工具没有抱怨,但我还要确保buffer.size()(a std::size_t)适合DWORD,这在64位版本中可能不是这样。< / p>