gpt4 book ai didi

c++ - 这是 Klocwork 的误报吗

转载 作者:行者123 更新时间:2023-11-30 04:02:03 27 4
gpt4 key购买 nike

背景

考虑以下代码:

    template <typename T>
void WriteData(const size_t &offset, const T &data)
{
if(sizeof(data) <= 8) //if size is 64bits or less, memcpy is not as efficient as a direct write
*reinterpret_cast<T*>(reinterpret_cast<char*>(_memView) + offset) = data;
else
{
errno_t result = memcpy_s(reinterpret_cast<char*>(_memView) + offset, SHARED_BUFFER_SIZE - offset, &data, sizeof(data));
if(result != 0)
throw exception("Error writing data");
}
}

假设 _memView 被声明为空指针。memcpy_s 尚未在任何地方重新定义。

该函数仅使用以下类型进行实例化:char、int、HANDLE、unsigned int、long 和 unsigned long。不要陷入此片段的其他问题,这是关于 klocwork 的。

此模板化代码是类的一部分,因此位于头文件中。

如果我遗漏了其他相关信息,请询问。

问题

在使用 Klocwork 进行分析后,我收到 SV.BANNED.COPY 警告:“不要使用不安全的缓冲区复制函数——考虑使用安全的变体,例如 strcpy_s”

所以我在这里用我调用 memcpy_s 的方式做了一些脑死的事情吗? Klocwork 认为 memcpy_s 是不安全的吗? Klocwork 是否对转换为 char* 感到困惑,并认为我正在操纵 C 风格的字符串?

我想了解 Klocwork 试图告诉我的内容,即使它只是告诉我这是误报。

最佳答案

根据标准 C++,此函数有各种问题。

  • if 分支执行未对齐写入并违反严格别名。

两个分支都会愉快地注销缓冲区的末尾。

  • if 分支根本不检查大小。
  • else 分支在计算缓冲区大小参数时受制于无符号进位。

memcpy_s 并不是万灵药。使用 memcpy 并考虑参数验证将击败每次盲目调用 memcpy_s

更正版本:

template <typename T>
void WriteData(const size_t &offset, const T &data)
{
if (sizeof data > SHARED_BUFFER_SIZE)
throw exception("Type cannot fit in shared buffer");
if (offset > SHARED_BUFFER_SIZE - sizeof data)
throw exception("Copy would overrun end of shared buffer");
memcpy(reinterpret_cast<char*>(_memView) + offset, &data, sizeof data);
}

要有效地处理小拷贝,请确保启用编译器将 memcpy 作为内在函数处理。

关于c++ - 这是 Klocwork 的误报吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25428082/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com