5

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 使用过,误报吗?

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

4

3 回答 3

3

这个

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

是误报。

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

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

于 2017-07-19T16:14:38.620 回答
2

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

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

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

于 2017-07-19T16:14:20.300 回答
2

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

您可以通过在您确定 100% OK 的行尾添加//-V112来抑制个别警告。

size_t const n = 4; //-V112

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

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

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

于 2017-07-19T16:37:57.963 回答