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, более подробно здесь. Скоро будет исправлено.

Другие вопросы по тегам