- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景
考虑以下代码:
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/
对于相同的代码库,当执行 klocwork 时,对于两个不同版本的 KW,我们得到的结果有所不同。 例如对于特定文件,KW 9 抛出以下错误: #6325:无限循环“文件路径”代码:INFINITE_
我的代码混合了旧代码的不同部分。 为了保持代码简单,我想删除所有从未使用过的函数。 Klocwork 是工具吗?我该怎么做? 谢谢, 摩西。 最佳答案 您可以使用 -p 或 -pg 选项到 gcc 来
Klocwork 报告错误:- "ABR – Buffer overflow, array index of 'oidsp' may be out of bounds. Array 'oidsp' o
背景 考虑以下代码: template void WriteData(const size_t &offset, const T &data) { if(si
Klocwork 在以下条件行中表示“无符号值与 0 的比较始终为真”: #define MAX_VALUE 8589934592 //2^33 ... uint64_t val = get_val(
我的项目由大量旧代码的点点滴滴组成。 我如何知道实际使用了多少行代码? Klocwork 可以给我这个答案吗?我注意到 Klocwork 保存项目中的行数 (SLOC) - 但它是实际使用的行数 -
我们使用 Klocwork 9.6 进行静态代码分析。 为了执行分析,我们使用命令行工具“kwcheck”命令 我们只想过滤掉一些错误。 例如 (Local) *.cpp:134 UNINIT.STA
我正在尝试运行 kwinject 命令。问题是我的一个 Makefile 编译了一个我不想扫描的目录,那么,有没有办法排除这些文件?我尝试使用 kwinject --ignore-files {dir
我发现 Klocwork 报告的一些问题非常奇怪。例如 - if(NULL == m_pMutex.get()) { Log("found unexpected sharedPtr m_pMu
Klocwork throw resource acquired to 'ofs.open("file.txt", std::ofstream::out)' may be lost here 对于下面
我有 C++ 代码,其中包含: struct Struct { uint8_t varA : 1; uint8_t varB : 1; uint8_t varC : 1; };
代码如下: char path = "/temp/abc"; if (mkfifo(path, S_IRWXU) != -1) { /* Other codes. */ } 对于 if 检查,
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我最近安装了“klocwork”并试图消除现有代码中的错误。显示的错误似乎很简单。 char * _p_ 结尾处没有空值。我已经手动添加了一个空终止符(即使没有必要),但它不会让 Klocwork 满
使用一个简单的例子,Klocwork insight 检测到: namespace po = boost::program_options; po::options_description oArgD
在这篇文章的帮助下, https://support.roguewave.com/documentation/klocwork/en/10-x/cs.nps/ 即使在明确设置安全性之后,我仍然收到 k
我使用 looking for 工具来解决 help detect 错误,这些错误阻止程序作为 64 位代码正常运行。最近,我一直在玩弄 Klocwork 及其自定义跳棋功能,它让我可以使用 XPat
'Klocwork' profiller 在以下代码部分生成错误 ['it.second.name_._M_dataplus._M_p' might be used uninitialized in
我是一名优秀的程序员,十分优秀!