使用了危险幻数N

时间:2017-07-19 15:39:18

标签: c++ static-analysis pvs-studio

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使用了,是假阳性?

上述两个代码示例未被分析为等效的原因是什么?

3 个答案:

答案 0 :(得分:3)

size_t const n = 4;
int a[n] = {};

是假阳性。

64位诊断非常嘈杂,你无能为力。是的,分析器产生许多误报,例如40xFFFFFFFF等幻数。在分析器中,当它没有抱怨时已经做了很多例外(例如:{{ 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位版本,那么我认为现在一直禁用警告是安全的。但要注意 - 来自视线的来自心灵。