2010-04-15 17 views
6

Mam następującą funkcję aby uzyskać int z wysokiej bajt i niskiej bajt:Dlaczego ostrzeżenie FxCop o przepełnieniu (CA2233) w tym kodzie C#?

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

Kiedy analizuje zespół z FxCop, pojawia się następujący krytyczne ostrzeżenie:

CA2233: OperationsShouldNotOverflow
Operacje arytmetyczne nie powinny być wykonywane bez sprawdzania poprawności operandów , aby zapobiec przepełnieniu.

Nie widzę, jak to możliwe, że może się przelać, więc zakładam, że FxCop jest nadgorliwy.
Czy czegoś brakuje? I jakie kroki można podjąć, aby poprawić to, co mam (lub przynajmniej sprawić, by ostrzeżenie FxCop zniknęło!)?

+1

Mój zakład dotyczy części "byte.MaxValue + 1". – Pwninstein

+4

Twój zakład jest nieprawidłowy. Jego kod nie może powodować przepełnienia, ponieważ bajt.MaxValue będzie ZAWSZE był niejawnie konwertowany na int przed krokiem dodawania. - Za każdym razem, gdy metoda wykonuje operację arytmetyczną i nie sprawdza wcześniej operacji (aby zapobiec przepełnieniu) otrzymasz CA2233. Istnieje wiele przykładów naprawienia tego w witrynie MSDN pod adresem http://msdn.microsoft.com/en-us/library/ms182354.aspx – BrainSlugs83

+0

Przeczytaj http://msdn.microsoft.com/en-us/library/ ms182354.aspx – Lijo

Odpowiedz

3

Jak Daniel A. Whitepointed out, otrzymasz wiadomość, ponieważ "(byte.MaxValue + 1)" przelewa bajt.

Ale zamiast odlewania i mnożąc, chciałbym po prostu przesuwają bity jak to zrobiono w poniższym kodzie:

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

Jako efekt uboczny, kod ten będzie prawdopodobnie działać lepiej. Nie sprawdziłem wynikowego IL lub x86, aby sprawdzić, czy kompilator i/lub JITter są wystarczająco inteligentne, aby zoptymalizować oryginalne wyrażenie.

+4

Ponownie, bajt.MaxValue + 1 nie przepełnia bajta. Dostaje wiadomość, ponieważ nie zatwierdza swoich operandów. Odchodzi dla twojego kodu, ponieważ twój kod nie wykonuje żadnej arytmetycznej, tylko binarnej logiki. Więcej informacji można znaleźć na stronie http://msdn.microsoft.com/en-us/library/ms182354.aspx. – BrainSlugs83

5

Wykonuje je jako obliczenia bajtów.

Spróbuj

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

+1 Właśnie miałem odpowiedzieć z tym samym rzeczą :) – Pwninstein

+0

Właśnie miałem to napisać! Miło i szybko. :) – Joshua

+1

-1! (jeśli mógłbym!) To jest nieprawidłowe.Nie musisz odlać bajtu.MaxValue jako liczbę całkowitą - jeśli dodasz liczbę całkowitą i bajt - bajt jest AUTOMATYCZNIE rzutowany na liczbę całkowitą - jest to cały punkt niejawnej konwersji. Dla dowodu zauważ: public static int GetValue() {return Byte.MaxValue + 1} zwraca wartość 256. Byte + Int = Int. Należy również pamiętać, że podany kod nie spowoduje, że ostrzeżenie FxCop CA2233 zniknie. Po prostu (i + 1) (gdzie i jest int) spowoduje to ostrzeżenie. – BrainSlugs83

3

Oto 2 sposoby, że w końcu zatrzymał narzekać CA2233 dla mnie:

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

myślę, że może to być błąd w regule.

4

Dodawanie bajtów i wiele wyników to ints. Maksymalna wartość to 65535, która nie przepełni int. Po prostu stłumić błąd.

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

obj ma typ int

Spróbuj tego:

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

żaden problem.

lub spróbować

Powiązane problemy