2010-04-15 65 views
6

我有以下函数来获得从高字节和低字节的int:为什么FxCop在这个C#代码中有关溢出(CA2233)的警告?

public static int FromBytes(byte high, byte low) 
{ 
    return high * (byte.MaxValue + 1) + low; 
} 

当我分析组件,的FxCop,我得到以下严重警告:

CA2233:操作不应该溢出
如果不首先验证 操作数以防止溢出,则算术运算不应该为 。

我看不出这可能会溢出,所以我只是假设FxCop是过度热情。
我错过了什么吗?并且可以采取哪些措施来纠正我所拥有的(或者至少让FxCop警告消失!)?

+1

我打赌是在“byte.MaxValue + 1”部分。 – Pwninstein 2010-04-15 01:36:27

+4

您的投注是错误的。他的代码不会导致溢出,因为在添加步骤发生之前,byte.MaxValue总是隐式转换为int。 - 任何时候,一个方法执行一个算术运算,并且不事先验证操作数(以防止溢出),您将得到CA2233。有很多关于如何在MSDN上修复此问题的示例,地址为:http://msdn.microsoft.com/en-us/library/ms182354.aspx – BrainSlugs83 2012-01-09 04:43:57

+0

阅读http://msdn.microsoft.com/en-us/library/ ms182354.aspx – Lijo 2012-11-19 07:27:59

回答

3

作为Daniel A. Whitepointed out,你得到的消息,因为 “(byte.MaxValue + 1)” 溢出一个字节。但是,铸造和乘法,而不是

,我只想位如下面的代码进行转移:

public static int FromBytes(byte high, byte low) { 
    return high << 8 | low; 
} 

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

+4

再次,byte.MaxValue + 1不会溢出字节。他得到的消息是因为他没有验证他的操作数。因为你的代码不执行任何算术运算,所以它只能用二进制逻辑。有关更多详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms182354.aspx。 – BrainSlugs83 2012-01-09 04:45:36

5

它正在做他们作为字节计算。

试试这个

return (int)high * ((int)byte.MaxValue + 1) + (int)low; 
+0

+1我只是想用同样的东西回答:) – Pwninstein 2010-04-15 01:37:47

+0

我正要写这篇文章!好而快。 :) – Joshua 2010-04-15 01:39:33

+1

-1! (如果我可以!)这是不正确的。您不需要将byte.MaxValue转换为整数 - 当您添加整数和字节时 - 该字节将自动转换为整数 - 这是隐式转换的全部要点。 为证明,请注意:public static int GetValue(){return Byte.MaxValue + 1}返回值256. Byte + Int = Int。 此外,请注意,您提供的代码不会使CA2233 FxCop警告消失。简单地说(我+ 1)(其中我是一个int)将导致此警告。 – BrainSlugs83 2012-01-09 04:40:10

3

这里有2种方式,它最终停止抱怨CA2233对我来说:

public static int FromBytes(byte high, byte low) 
    { 
     int h = high; 
     return h * (byte.MaxValue + 1) + low; 
    } 

    public static int FromBytes2(byte high, byte low) 
    { 
     unchecked 
     { 
      return high * (byte.MaxValue + 1) + low; 
     } 
    } 

我想可能是在规则中的错误。

4

字节加和多结果是整数。这里的最大值是65535,它不会溢出int。只要抑制错误。

byte a = 1; 
byte b = 2; 
object obj = a + b 

的obj的类型为int

试试这个:

 byte high = 255; 
     byte low = 255; 
     checked 
     { 
      int b = high * (byte.MaxValue + 1) + low; 
     } 

没问题。

或试试这个