PVS-Studio,静态代码分析器,用于以下代码
size_t const n = 4;
int a[n] = {};
报告:
V112使用了危险幻数
4
:...t const n = 4;. test.cpp 3
虽然PVS-Studio与Visual Studio 2017项目一起使用并报告32位和64位的相同警告,但分析器AFAIU不会考虑这些构建配置。
我原本期望更好地分析上下文,并将上面的代码视为与此
等效int a[4] = {};
PVS-Studio不会发出任何诊断信息。
在上面的情况下,这个危险幻数N使用了,是假阳性?
上述两个代码示例未被分析为等效的原因是什么?
答案 0 :(得分:3)
此
size_t const n = 4;
int a[n] = {};
是假阳性。
64位诊断非常嘈杂,你无能为力。是的,分析器产生许多误报,例如4
,0xFFFFFFFF
等幻数。在分析器中,当它没有抱怨时已经做了很多例外(例如:{{ 1}})。但是,使用常量仍有很多选择,因此无法预见所有这些选项。
当将代码移植到64位系统时,查看所有幻数是有意义的,例如,确保程序员不希望某个地方的指针大小为int a[4] = {};
个字节。然后关闭V112诊断以便它不会打扰你是有意义的。
答案 1 :(得分:2)
阅读你发布的链接,我认为这是你的错误判断。
该工具假设您将在n
(或等效分配过程)语句中使用malloc
等同于int
(或任何4字节变量)的大小。因此建议使用sizeof(desired type)
。
如果你在n
语句中使用malloc
,那就有意义了 - 因为int
(或任何其他类型)可能因不同的体系结构而有所不同(如果不是现在,则在未来)。但显然这不是你的情况。
答案 2 :(得分:2)
当从32位移植到64位时,数字4被视为潜在的危险数字之一,因此警告const被分配4.其他数字列在您发布的链接后面的表格中。举例说明它是如何危险的。
您可以通过在行尾添加 // - V112 suppress individual warning来确定100%确定。
size_t const n = 4; //-V112
这将取消警告,您可以再次专注于您的工作。
至于int a[4] = {};
,PVS-Studio认为这是一个特殊情况,它不会发出警告。为什么在我不知道的第一种情况下不考虑它。但对于特定情况,它看起来像是硬编码的例外。
如果你没有构建64位版本,那么我认为现在一直禁用警告是安全的。但要注意 - 来自视线的来自心灵。