我应该注意 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 Code 如何解决与 git 的合并冲突?
我的 C 代码没有在 Visual Studio 2017 上编译,并且一直给我一个错误,说它找不到特定的文件?