2010-04-15 32 views
6

tôi có chức năng sau đây để có được một int từ một byte cao và byte thấp:Tại sao cảnh báo FxCop về lỗi tràn (CA2233) trong mã C# này?

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

Khi tôi phân tích lắp ráp với FxCop, tôi nhận được cảnh báo quan trọng sau đây:

CA2233: OperationsShouldNotOverflow
Hoạt động số học không được là được thực hiện mà không cần xác nhận hợp lệ các toán hạng để tránh tràn.

Tôi không thể thấy cách điều này có thể tràn, vì vậy tôi giả định rằng FxCop đang quá hăng hái.
Tôi có thiếu gì đó không? Và những gì các bước có thể được thực hiện để sửa chữa những gì tôi có (hoặc ít nhất là làm cho cảnh báo FxCop biến mất!)?

+1

Đặt cược của tôi là ở phần "byte.MaxValue + 1". – Pwninstein

+4

Đặt cược của bạn là sai. Mã của anh ta không thể gây ra tràn từ byte.MaxValue sẽ luôn được chuyển đổi hoàn toàn thành int trước khi bước bổ sung diễn ra. - Bất cứ khi nào một phương thức thực hiện phép toán số học và không xác nhận hợp lệ toán hạng trước (để ngăn chặn tràn), bạn sẽ nhận được CA2233. Có rất nhiều ví dụ về cách sửa lỗi này trên MSDN tại http://msdn.microsoft.com/en-us/library/ms182354.aspx – BrainSlugs83

+0

Đọc http://msdn.microsoft.com/en-us/library/ ms182354.aspx – Lijo

Trả lời

3

Như Daniel A. Whitepointed out, bạn nhận được thông báo bởi vì "(byte.MaxValue + 1)" tràn một byte.

Nhưng thay vì đúc và nhân lên, tôi chỉ đơn giản là sẽ chuyển các bit như thực hiện trong mã bên dưới:

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

Như một tác dụng phụ, mã này có thể sẽ thực hiện tốt hơn. Tôi chưa kiểm tra kết quả IL hoặc x86 để xem trình biên dịch và/hoặc JITter có đủ thông minh để tối ưu hóa biểu thức gốc hay không.

+4

Một lần nữa, byte.MaxValue + 1 không tràn byte. Anh ta nhận được thông điệp bởi vì anh ta không hợp lệ hóa các toán hạng của mình. Nó biến mất cho mã của bạn vì mã của bạn không thực hiện bất kỳ số học nào, chỉ logic nhị phân. Xem http://msdn.microsoft.com/en-us/library/ms182354.aspx để biết thêm chi tiết. – BrainSlugs83

5

Nó đang làm chúng như tính toán byte.

Hãy thử điều này

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

+1 Tôi đã chuẩn bị trả lời cùng một điều :) – Pwninstein

+0

Tôi vừa mới viết điều đó! Đẹp và nhanh. :) – Joshua

+1

-1! (nếu tôi có thể!) Điều này là không chính xác.Bạn không cần phải cast byte.MaxValue như là một số nguyên - khi bạn thêm một số nguyên và một byte - byte được tự động đúc thành một số nguyên - đây là toàn bộ điểm của một chuyển đổi ngầm định. Để tìm bằng chứng, hãy chú ý: public static int GetValue() {return Byte.MaxValue + 1} trả về giá trị 256. Byte + Int = Int. Ngoài ra, xin lưu ý rằng mã bạn đã cung cấp sẽ không khiến cảnh báo CA2233 FxCop biến mất. Đơn giản (i + 1) (trong đó i là int) sẽ gây cảnh báo này. – BrainSlugs83

3

Dưới đây là 2 cách mà nó cuối cùng dừng lại rên rỉ về CA2233 cho tôi:

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; 
     } 
    } 

Tôi nghĩ rằng nó có thể là một lỗi trong các quy tắc.

4

Bổ sung byte và kết quả nhiều là int. Giá trị tối đa ở đây là 65535 mà sẽ không tràn một int. Chỉ cần nhấn lỗi.

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

obj có kiểu int

Hãy thử điều này:

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

Không có vấn đề.

hoặc thử này

Các vấn đề liên quan