为什么FxCop警告此C#代码中的溢出(CA2233)?

Mat*_*ing 6 .net c# fxcop overflow

我有以下函数从高字节和低字节获取一个int:

public static int FromBytes(byte high, byte low)
{
    return high * (byte.MaxValue + 1) + low;
}
Run Code Online (Sandbox Code Playgroud)

当我用FxCop分析程序集时,我收到以下严重警告:

CA2233:OperationsShouldNotOverflow
如果没有先验证操作数以防止溢出,则不应进行算术运算.

我无法看到这可能会溢出,所以我只是假设FxCop过于热心.
我错过了什么吗?可以采取哪些措施来纠正我所拥有的(或至少使FxCop警告消失!)?

Dan*_*ite 5

它将它们作为字节计算.

试试这个

return (int)high * ((int)byte.MaxValue + 1) + (int)low;
Run Code Online (Sandbox Code Playgroud)


Alf*_*ers 3

正如Daniel A. White 指出的那样,您收到该消息是因为“(byte.MaxValue + 1)”溢出了一个字节。

但我不会进行转换和乘法,而是简单地按以下代码中的方式移动位:

public static int FromBytes(byte high, byte low) {
    return high << 8 | low;
}
Run Code Online (Sandbox Code Playgroud)

作为副作用,此代码可能会执行得更好。我还没有检查生成的 IL 或 x86 以查看编译器和/或 JITter 是否足够智能来优化原始表达式。

  • 同样,byte.MaxValue + 1 不会溢出字节。他收到消息是因为他没有验证他的操作数。它会在您的代码中消失,因为您的代码不执行任何算术,只执行二进制逻辑。有关详细信息,请参阅 http://msdn.microsoft.com/en-us/library/ms182354.aspx。 (4认同)