gpt4 book ai didi

c# - 为什么我需要检查是否大于 Int32.MaxValue?

转载 作者:可可西里 更新时间:2023-11-01 08:11:02 26 4
gpt4 key购买 nike

我在 c# 类库项目 (.net 4) 上使用 Visual Studio 2010 SP1 Ultimate,我对某些事情感到好奇...

给定这个方法:

public void DoSomethingBrilliant(int input)
{
if (input == int.MaxValue)
throw new ArgumentOutOfRangeException("input");

input++;

Console.WriteLine(input);
}

我从代码分析中得到这个警告:

CA2233 : Microsoft.Usage : Correct the potential overflow in the operation 'input+1' in 'Test.DoSomethingBrilliant(int)'.

我心想,这有点奇怪,因为我正在检查 input++ 操作不会通过在开始时抛出那个时髦的异常而溢出,但我将其更改为:

public void DoSomethingBrilliant(int input)
{
if (input >= int.MaxValue)
throw new ArgumentOutOfRangeException("input");

input++;

Console.WriteLine(input);
}

果然警告消失了。

现在我的小脑袋都糊涂了,因为我得到了一个 int作为一个论点,为什么要检查它是否大于整数允许的最大值是否提供任何值?

然后我回到原来的代码位并切换到调试,它在没有警告的情况下构建了!越来越好奇……

我检查了调试和发布之间的差异,发现如果我勾选优化代码选项,代码分析的警告会立即弹出。

所以优化结果意味着我需要检查大于 int.MaxValue 的值.嗯?为什么?我是 super 密集吗?优化做了什么,这意味着我可能会得到一个大于 int.MaxValue 的整数传递到接受 int 的方法中?

或者,这只是代码分析功能中的错误吗?

更新

这是“未优化”版本的 IL(代码分析正确):

.method public hidebysig instance void  DoSomethingBrilliant(int32 input) cil managed
{
// Code size 40 (0x28)
.maxstack 2
.locals init ([0] bool CS$4$0000)
IL_0000: nop
IL_0001: ldarg.1
IL_0002: ldc.i4 0x7fffffff
IL_0007: ceq
IL_0009: ldc.i4.0
IL_000a: ceq
IL_000c: stloc.0
IL_000d: ldloc.0
IL_000e: brtrue.s IL_001b
IL_0010: ldstr "input"
IL_0015: newobj instance void [mscorlib]System.ArgumentOutOfRangeException::.ctor(string)
IL_001a: throw
IL_001b: ldarg.1
IL_001c: ldc.i4.1
IL_001d: add
IL_001e: starg.s input
IL_0020: ldarg.1
IL_0021: call void [mscorlib]System.Console::WriteLine(int32)
IL_0026: nop
IL_0027: ret
} // end of method Test::DoSomethingBrilliant

这里是优化版(哪里搞错了):

.method public hidebysig instance void  DoSomethingBrilliant(int32 input) cil managed
{
// Code size 31 (0x1f)
.maxstack 8
IL_0000: ldarg.1
IL_0001: ldc.i4 0x7fffffff
IL_0006: bne.un.s IL_0013
IL_0008: ldstr "input"
IL_000d: newobj instance void [mscorlib]System.ArgumentOutOfRangeException::.ctor(string)
IL_0012: throw
IL_0013: ldarg.1
IL_0014: ldc.i4.1
IL_0015: add
IL_0016: starg.s input
IL_0018: ldarg.1
IL_0019: call void [mscorlib]System.Console::WriteLine(int32)
IL_001e: ret
} // end of method Test::DoSomethingBrilliant

我在 throw 操作之前看到了一堆额外的调用,但老实说 - 我不知道它们做了什么!

最佳答案

Or, is this just a bug in the code analysis feature?

看起来像。老实说,这并不奇怪——让这种代码分析变得完美是非常棘手的。鉴于任何特定的 int 不能 大于 int.MaxValue>=== 绝对等价。

关于c# - 为什么我需要检查是否大于 Int32.MaxValue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11226118/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com