RyuJIT C# 错误的总和结果与 /optimize
RyuJIT C# wrong sum result with /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);
}
如果我在 Debug 模式下构建我的应用程序,一切正常,test index pre
打印 12,test index post
打印 14。在 Release 模式下相同,但未选中 Optimize code
。如果我用 Optimize code
测试检查 test index post
打印 18 而不是 14.
如果我将 index += ethType.Length;
替换为 index += 2;
,结果相同。似乎只有 index++;index++;
在工作。
我在一个空的应用程序中尝试了这段代码,总和没问题。
应用程序是多线程的,但这里没有并发。
从 DLL 反编译代码似乎没问题。
知道为什么会这样吗?
编辑:
仅当为 x64 编译应用程序时才会发生。 x86 没问题。
编辑 3:构建环境的一些信息:
visual studio 15.0.0-RTW+26228.4
框架 4.7.02053
可以在框架 4.6.2 和 4.7 上触发此问题。其他框架未经过测试。
编辑 5:new, smaller example project。不需要任何依赖项。
编辑 6:测试项目的反汇编 here。 (这里太长了post)
这是 RyuJIT 中已经报告的错误,更多详细信息 here。将很快在修补程序中修复。
我有这段代码:
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);
}
如果我在 Debug 模式下构建我的应用程序,一切正常,test index pre
打印 12,test index post
打印 14。在 Release 模式下相同,但未选中 Optimize code
。如果我用 Optimize code
测试检查 test index post
打印 18 而不是 14.
如果我将 index += ethType.Length;
替换为 index += 2;
,结果相同。似乎只有 index++;index++;
在工作。
我在一个空的应用程序中尝试了这段代码,总和没问题。
应用程序是多线程的,但这里没有并发。
从 DLL 反编译代码似乎没问题。
知道为什么会这样吗?
编辑:
仅当为 x64 编译应用程序时才会发生。 x86 没问题。
编辑 3:构建环境的一些信息:
visual studio 15.0.0-RTW+26228.4
框架 4.7.02053
可以在框架 4.6.2 和 4.7 上触发此问题。其他框架未经过测试。
编辑 5:new, smaller example project。不需要任何依赖项。
编辑 6:测试项目的反汇编 here。 (这里太长了post)
这是 RyuJIT 中已经报告的错误,更多详细信息 here。将很快在修补程序中修复。