2017-08-02 48 views
9

Mam ten fragment kodu:RyuJIT C# zły wynik suma z/zoptymalizować

private void AnswerToCe(int currentBlock, int totalBlock = 0) 
{ 
    byte[] bufferToSend; 
    byte[] macDst = mac; 
    byte[] macSrc = ConnectionManager.SInstance.GetMyMAC(); 
    byte[] ethType; 
    byte[] header; 

    if (Function == FlashFunction.UPLOAD_APPL || Function == FlashFunction.UPLOAD_BITSTREAM) 
    { 
     ethType = BitConverter.GetBytes((ushort)EthType.ETH_TYPE_UPLOAD); 
     ethType = new byte[] { ethType[1], ethType[0] }; 
     header = Header.GetBytes((ushort)binaryBlocks.Count, (ushort)(currentBlock + 1), (ushort)binaryBlocks[currentBlock].Length); 
     int index = 0; 
     bufferToSend = new byte[macDst.Length + macSrc.Length + ethType.Length + header.Length + binaryBlocks[currentBlock].Length]; 
     Array.Copy(macDst, 0, bufferToSend, index, macDst.Length); 
     index += macDst.Length; 
     Array.Copy(macSrc, 0, bufferToSend, index, macSrc.Length); 
     index += macSrc.Length; 
     Logger.SInstance.Write(index.ToString(), "test index pre"); 
     Array.Copy(ethType, 0, bufferToSend, index, ethType.Length); 
     index += ethType.Length; 
     Logger.SInstance.Write(index.ToString(), "test index post"); 
     Array.Copy(header, 0, bufferToSend, index, header.Length); 
     index += header.Length; 
     Array.Copy(binaryBlocks[currentBlock], 0, bufferToSend, index, binaryBlocks[currentBlock].Length); 
    } 

Jeśli buduję mój wniosek w trybie debugowania wszystko jest ok, test index pre drukuje 12 i 14. test index post drukuje to samo w wydaniu tryb z Optimize code niezaznaczony. jeśli przetestuję z Optimize code sprawdziłem test index post drukuje 18 zamiast 14.
Ten sam wynik, jeśli zmienię index += ethType.Length; na index += 2;. wygląda na to, że działa tylko index++;index++;.
Próbowałem tego kodu w pustej aplikacji i sumy są w porządku.
Aplikacja jest wielowątkowa, ale tutaj nie ma współbieżności.
Dekompilowany kod z biblioteki DLL wydaje się być w porządku.
Jakieś pomysły, dlaczego tak się dzieje?

EDYCJA: Zdarza się tylko, gdy aplikacja jest kompilowana dla x64. x86 jest w porządku.
EDIT 3: niektóre informacje kompilacji env:
Visual Studio 15.0.0-RTW + 26228,4
framework 4.7.02053
może wywołać tę kwestię na ramach 4.6.2 i 4.7. inne frameworki nie są testowane.
EDYCJA 5: new, smaller example project. nie są potrzebne żadne zależności.
EDYCJA 6: demontaż projektu testowego here. (zbyt długo, aby opublikować go tutaj)

+0

"Aplikacja jest wielowątkowa, ale tutaj nie ma współbieżności." Trudno powiedzieć, ponieważ jest to tylko część twojego kodu i używa niektórych zmiennych spoza tej funkcji. –

+0

https://msdn.microsoft.com/en-us/library/c151dt3s.aspx – StefanE

+0

@ Punkty przerwania PawełŁukasik trafiają tylko raz. zmienna indeksowa nie jest zewnętrzna. – rmbq

Odpowiedz

0

To był już zgłoszony błąd w RyuJIT, więcej szczegółów here. Zostanie wkrótce poprawiony w poprawce.