使用了危险的幻数 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 位诊断非常嘈杂,您对此无能为力。是的,分析器会产生许多误报,例如 4
、0xFFFFFFFF
等幻数。在分析器中,当它不报错时,已经产生了很多异常(例如: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 位版本,那么我认为现在完全禁用警告是安全的。但请注意 - 眼见为实。
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 位诊断非常嘈杂,您对此无能为力。是的,分析器会产生许多误报,例如 4
、0xFFFFFFFF
等幻数。在分析器中,当它不报错时,已经产生了很多异常(例如: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 位版本,那么我认为现在完全禁用警告是安全的。但请注意 - 眼见为实。