使用危险的幻数N

Dangerous magic number N used

本文关键字:危险      更新时间:2023-10-16

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,是误报吗?

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

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

是误报。

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

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

阅读您发布的链接,我得出结论,在您的情况下这是误报。

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

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

从32 位移植到 64 位时,数字 4 被认为是潜在的危险数字之一,因此在分配 4 的 const 时发出警告。其他号码列在您发布的链接后面的表格中。举例说明它是如何危险的。

您可以通过在您确定 100% 正常的行尾添加//-V112来禁止单个警告。

size_t const n = 4; //-V112

这将取代警告,您可以再次专注于您的工作。

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

如果您不构建 64 位构建,那么我认为现在完全禁用警告是安全的。但请注意 - 来自视觉来自思想。