我应该注意 Visual Studio 给我的这个警告吗?

Posted

技术标签:

【中文标题】我应该注意 Visual Studio 给我的这个警告吗?【英文标题】:Should I pay attention this warning that Visual Studio gives me? 【发布时间】:2020-03-01 21:33:56 【问题描述】:

我有一个名为 dim 的 32 位整数,我正在使用 new 保留一个无符号字符数组,即 dim * dim * dim 大。 Visual Studio 说我应该在执行此操作之前将dim 转换为 64 位整数,但我觉得这并不重要。

unsigned char* cells = new unsigned char[dim * dim * dim];
C26451: Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2).

dim 不会大于 1000。

【问题讨论】:

如果 dim 可以是 1.000,那么 dim * dim * dim 可以是 1.000.000.000,这至少超出了 int 的较小实现。 @Yunnosch 警告告诉我们int 是 4 个字节,就像在现代 Windows 上一样。 @AsteroidsWithWings True. 【参考方案1】:

由于dim 不会大于 1,000,因此您的表达式可以最大为 1,000 × 1,000 × 1,000 — 也称为 1,000,000,000。这适合 32 位整数(您的 int 显然是),因此您的程序不会有溢出的风险。

但是,编译器不知道这一点。有时它有足够的信息来“证明”这些约束本身;有时它不会。显然,在这里,它没有。而且,由于您对数组维度的“参数”是一个 64 位整数,它告诉您——如果您确实可能有更大的dim 值——您可以降低 可避免通过预先转换为您最终将要使用的类型来实现溢出。

(当然,如果你的表达式最终可能大于 Uint64.Max,那么无论你做什么,所有的赌注都会被取消。)

关于 C26451 的问题不时出现,因为它似乎有点过分热心on occasion。就我个人而言,我会考虑禁用它,但如果你订阅了“从不禁用警告”类别的人,那就照它说的做。它不会真的伤害到你,而且这个特别的建议可以说是一个值得养成的好习惯。

【讨论】:

【参考方案2】:

您应该注意警告; operator new[] 期望数组大小值为 std::size_t

【讨论】:

然后呢?所以?因此? 因此,为它提供std::size_t的数组大小值。 这就是 OP 正在做的事情(通过隐式转换)。您根本没有解决这个问题,即关于溢出和警告的准确性。 问题是“我应该注意(注意)Visual Studio 给我的这个警告吗?”。

以上是关于我应该注意 Visual Studio 给我的这个警告吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 2005 中创建 DLL

Visual Studio Code 如何解决与 git 的合并冲突?

Visual Studio 2010 运行时库

我的 C 代码没有在 Visual Studio 2017 上编译,并且一直给我一个错误,说它找不到特定的文件?

如何在Visual Studio 2010中创建Crystal Reports [关闭]

刷新Visual Studio中的自动完成(IntelliSense)数据库