使用危险的幻数N
Dangerous magic number N used
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位诊断非常嘈杂,您对此无能为力。是的,分析器会产生许多误报,例如幻数,如4
、0xFFFFFFFF
等。在分析器中,当它不抱怨时,已经有很多异常(例如: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 位构建,那么我认为现在完全禁用警告是安全的。但请注意 - 来自视觉来自思想。
- 既然存在危险,为什么项目要使用-I include开关
- 未初始化的变量有什么危险
- 将字符移出范围的危险
- 在C++的头文件中使用常量并在程序中询问其地址的任何潜在危险
- CRTP - 危险的内存访问?
- 危险指针的内存排序
- 在对象构造期间,将指向尚未构造的子对象的指针传递给另一个子对象的构造函数是否危险?
- 为什么 CWE 认为 rand() 具有潜在危险
- "this"关键字在C++中的实现限制,因为它与危险但功能示例有关
- cppcheck 抱怨危险地使用 c_str(). c_str() 返回的值在此调用后无效
- cpp 检查抱怨危险使用 c_str(). c_str() 返回的值在本次调用后无效,如何解决?
- 使用危险的幻数N
- 派生类的模板类作为函数的参数 - 危险?
- CUDA:来自不同翘曲但相同块的 2 个线程尝试写入相同的共享内存位置:危险?
- 聚合初始化的 C++17 扩展是否使大括号初始化变得危险?
- 从 int 到 longlong 的危险转换:没有警告
- 在模板中存储右值引用的危险
- 这个危险指针示例是否因为 ABA 问题而存在缺陷?
- 是否存在与将数据流式传输到 c++ 异常类相关的任何危险
- EiffelStudio 编译错误:使用 'tempnam' 很危险,最好使用 'mkstemp'