如何改进漏洞发现者 memset 警告的代码?
Posted
技术标签:
【中文标题】如何改进漏洞发现者 memset 警告的代码?【英文标题】:How to improve code around flawfinder memset warning? 【发布时间】:2021-12-03 12:15:21 【问题描述】:在我的代码中,对memset
的所有调用都显示为带有flawfinder
tool 的警告。
在最简单的情况下,它可以归结为等价于
float f1;
float f2;
void* p1 = &f1;
void* p2 = &f2;
memcpy(p1, p2, sizeof(float));
消息是
./file.cpp:10: [2] (buffer) memcpy:
Does not check for buffer overflows when copying to destination (CWE-120).
Make sure destination can always hold the source data.
我完全理解这可以用一个简单的副本来代替,这只是一个简化的例子。 我也了解使用 memcpy 和缓冲区溢出的潜在问题。
问题是faultfinder 到底要求我做什么?
也许像添加assert
之类的? (这并没有抑制警告)
assert( sizeof(*p1) == sizeof(*p2) );
memcpy(p1, p2, sizeof(float));
还是只是告诉我不要使用memset
?
我正在使用 C++ 编程,但我很确定问题和解决方案对于 C 和 C++ 语言都是通用的。
【问题讨论】:
如果您使用 C++ 编程,请不要添加无关的 C 语言标签。 C 和 C++ 是两种非常不同的语言。 这个 CWE 东西听起来不像是一个值得信赖的编码标准。你能告诉工具检查 CERT-C 或 MISRA-C 吗? 好像someone had a similar problem, but the community didn't find a solution。不过,那里有一些有用的 cmets。 @Someprogrammerdude,这个问题适用于两种语言,该工具也适用于两种语言。memset
可以从两种语言中调用。我可以用memset
替换std::memset
。标签的想法是人们可以找到问题的答案,无论他们是用 C 还是 C++ 编程。如果有答案,他们可能会有相同的答案。
@alfC:该工具可以用于两种语言,memset
可以从两种语言中调用,但这并不意味着两种语言的问题相同。由于有关转换的规则和其他问题,不同语言的解决方案(或缺乏解决方案)可能会有所不同。混合这两个标签会使寻求 C 解决方案的人更难在 C++ 讨论中找到它们,反之亦然。除非询问两种语言之间的差异或交互,否则不要同时标记 C 和 C++。
【参考方案1】:
errno_t err = memcpy_s(dest, dsize, src, cnt);
这应该是“安全”版本,希望能满足漏洞发现者的需求
【讨论】:
我不知道memcpy_s
,我正试图找出确切的区别。我猜memcpy(p1, p2, sizeof(float));
的等价物将是memcpy_s(p1, sizeof(float), p2, sizeof(float))
,或更对称的memcpy_s(f1, sizeof(*f1), f2, sizeof(*f2))
。这是迄今为止我找到的最好的描述“这些函数 [ (w)memcpy_s] ] 验证它们的参数。如果 count 不为零并且 dest 或 src 是空指针,或者 destSize 小于 count,则这些函数调用无效参数处理程序,如参数验证中所述。”它们也会返回状态。
看来需要一些杂技才能使用memcpy_s
***.com/questions/31278172/…。从 C++ 看来,这并不容易(正如@EricPostpischil 预测的那样)。在任何情况下,查看我的代码,memcpy_s
可能对我的情况没有用处,因为我正在处理堆栈变量(从不为空)并且具有编译时大小(我与 static_assert( sizeof(t1) == sizeof(t2) );
单独检查. 总之,我认为这可以安抚漏洞发现者,但我还无法验证。
您是否有理由不能使用赋值运算符或其他“现代”概念?
好问题,我必须重新审视逻辑,但我认为我使用std::memcpy
而不是通过reinterpret_cast
分配以避免违反别名规则。 (在这里寻找“memset”en.cppreference.com/w/cpp/language/reinterpret_cast)以上是关于如何改进漏洞发现者 memset 警告的代码?的主要内容,如果未能解决你的问题,请参考以下文章