我最近在正在使用HP fortify的项目上运行了代码扫描。 据报道,我对ReadFile存在严重问题。 我从不传递空缓冲区。 有关如何解决潜在缓冲区溢出问题的任何建议。
摘要
serialport.cpp中的函数Read()可能能够在第225行的已分配内存的边界外写入,这可能会破坏数据,导致程序崩溃或导致恶意代码的执行。
throw error
答案 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>