使用了危险的幻数 N

Dangerous magic number N used

PVS-Studio,静态代码分析器,用于以下代码

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

报告:

V112 Dangerous magic number 4 used: ...t const n = 4;. test.cpp 3

尽管 PVS-Studio 与 Visual Studio 2017 项目一起使用,并针对 32 位和 64 位报告相同的警告,但分析器 AFAIU 并未考虑这些构建配置。

我本来希望能更好地分析上下文并将上面的代码视为等同于此

int a[4] = {};

PVS-Studio 不会对其发出任何诊断。

在上面的例子中,使用了危险的幻数 N,是误报吗?

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

阅读了您发布的link,我断定您的情况是误报。

该工具假设您将在 malloc(或等效的分配过程)语句中使用 n 等同于 int(或任何 4 个字节)的大小多变的)。所以推荐使用sizeof(desired type).

如果您在 malloc 语句中使用 n,这是有道理的 - 因为 int(或任何其他类型)可能因不同的体系结构而异(如果不是现在,在将来)。但显然这不是你的情况。

这个

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

是误报。

64 位诊断非常嘈杂,您对此无能为力。是的,分析器会产生许多误报,例如 40xFFFFFFFF 等幻数。在分析器中,当它不报错时,已经产生了很多异常(例如:int a[4] = {};).但是,使用常量的选项仍然很多,无法预见所有这些选项。

将代码移植到 64 位系统时,查看所有幻数是有意义的,例如,以确保程序员不会期望指针大小在某处为 4 字节。然后关闭 V112 诊断是有意义的,这样它就不会打扰你。

从 32 位移植到 64 位时,数字 4 被认为是潜在危险的数字之一,因此警告将 const 分配给 4。其他数字列在 link 后面的 table 中你发布了。举例说明它有多危险。

您可以 suppress individual warning 通过在行尾添加 //-V112 您确定 100% OK。

size_t const n = 4; //-V112

这将抑制警告,您可以重新专注于您的工作。

至于int a[4] = {};PVS-Studio认为这是一个特例,不会发出警告。我不知道为什么在第一种情况下不考虑它。但它看起来像是针对特定情况的硬编码异常。

如果您不构建 64 位版本,那么我认为现在完全禁用警告是安全的。但请注意 - 眼见为实。