From efcf98fc7885dc423bdf61b3423dddc63c36075f Mon Sep 17 00:00:00 2001 From: Carol Eidt Date: Thu, 13 Feb 2020 14:27:49 -0800 Subject: Port of dotnet/runtime#1059 to 3.1 branch (#27986) This is the fix for #27924. This is a GC hole bug that was found externally, #27590. The cause is that the JIT was using the target type of the subtract when it needed to make a copy of the source, but it needs to use the source type. ## Customer Impact Corruption of state that is non-deterministic and hard to track down. ## Regression? Not a recent regression, but exposed by Unsafe.ByteOffset. ## Testing The fix has been verified in the runtime repo. ## Risk Low: The fix is straightfoward and only impacts 3 lines of code. --- .../JitBlue/GitHub_27924/GitHub_27924.cs | 53 ++++++++++++++++++++++ .../JitBlue/GitHub_27924/GitHub_27924.csproj | 46 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 tests/src/JIT/Regression/JitBlue/GitHub_27924/GitHub_27924.cs create mode 100644 tests/src/JIT/Regression/JitBlue/GitHub_27924/GitHub_27924.csproj (limited to 'tests/src/JIT') diff --git a/tests/src/JIT/Regression/JitBlue/GitHub_27924/GitHub_27924.cs b/tests/src/JIT/Regression/JitBlue/GitHub_27924/GitHub_27924.cs new file mode 100644 index 0000000000..c4b8cf5be5 --- /dev/null +++ b/tests/src/JIT/Regression/JitBlue/GitHub_27924/GitHub_27924.cs @@ -0,0 +1,53 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Threading; +using System.Runtime.CompilerServices; +using System.Collections.Generic; +using System.Threading.Tasks; + +class Program +{ + static int returnVal = 100; + static byte[][] s = new byte[1000][]; + + static void Work() + { + for (uint i = 0; i < 1000000; i++) + { + var a = s[i++ % s.Length]; + + ref byte p = ref a[0]; + ref byte q = ref a[1]; + + if (Unsafe.ByteOffset(ref p, ref q) != new IntPtr(1)) + { + Console.WriteLine("ERROR: i = " + i); + returnVal = -1; + } + p = 1; q = 2; + } + } + + static int Main(string[] args) + { + for(int i = 0; i < s.Length; i++) s[i] = new byte[2]; + + List tasks = new List(); + for(int i = 0; i < 5; i++) + { + tasks.Add(Task.Run(Work)); + } + + Random r = new Random(); + for (uint i = 0; i < 10000; i++) + { + s[r.Next(s.Length)] = new byte[3 + r.Next(100)]; + } + Task t = Task.WhenAll(tasks); + t.Wait(); + return returnVal; + } +} diff --git a/tests/src/JIT/Regression/JitBlue/GitHub_27924/GitHub_27924.csproj b/tests/src/JIT/Regression/JitBlue/GitHub_27924/GitHub_27924.csproj new file mode 100644 index 0000000000..155de5c4fa --- /dev/null +++ b/tests/src/JIT/Regression/JitBlue/GitHub_27924/GitHub_27924.csproj @@ -0,0 +1,46 @@ + + + + + Debug + AnyCPU + $(MSBuildProjectName) + 2.0 + {95DFC527-4DC1-495E-97D7-E94EE1F7140D} + Exe + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + ..\..\ + + + + + + + False + + + + + True + True + + + + + + + + + + + + + + + -- cgit v1.2.3