RyuJIT C# неверный результат суммирования с /optimize
У меня есть этот кусок кода:
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);
}
Если я создаю свое приложение в режиме отладки, все в порядке, test index pre
печатает 12 и test index post
печатает 14. то же самое в режиме выпуска с Optimize code
бесконтрольно. если я проверю с Optimize code
проверено test index post
печатает 18 вместо 14.
Тот же результат, если я заменю index += ethType.Length;
с index += 2;
, кажется только index++;index++;
работает.
Я пробовал этот код в пустом приложении и суммы в порядке.
Приложение многопоточное, но здесь нет параллелизма.
Декомпилированный код из DLL выглядит нормально.
Есть идеи, почему это происходит?
РЕДАКТИРОВАТЬ: происходит только тогда, когда приложение скомпилировано для x64. х86 в порядке.
РЕДАКТИРОВАТЬ 3: некоторая информация о env сборки:
visual studio 15.0.0-RTW + 26228.4
рамки 4.7.02053
может вызвать эту проблему в рамках 4.6.2 и 4.7. другие фреймворки не тестируются.
РЕДАКТИРОВАТЬ 5: новый, меньший пример проекта. никаких зависимостей не требуется.
РЕДАКТИРОВАТЬ 6: разборка тестового проекта здесь. (слишком долго, чтобы опубликовать это здесь)
1 ответ
Это была уже сообщенная ошибка в RyuJIT, более подробно здесь. Скоро будет исправлено.