From 9ebd40c2644eb4309bff56fbebe8dbb4c2eeb05e Mon Sep 17 00:00:00 2001 From: Sangwook Kim Date: Thu, 6 Feb 2020 16:47:55 +0900 Subject: [PATCH 1/2] Fix unaligned memory access errors in TraceEvent --- src/TraceEvent/TraceEvent.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/TraceEvent/TraceEvent.cs b/src/TraceEvent/TraceEvent.cs index e93624e38..34de90c29 100644 --- a/src/TraceEvent/TraceEvent.cs +++ b/src/TraceEvent/TraceEvent.cs @@ -4368,19 +4368,21 @@ internal static unsafe Guid ReadGuid(IntPtr pointer, int offset) } internal static unsafe double ReadDouble(IntPtr pointer, int offset) { - return *((double*)((byte*)pointer.ToPointer() + offset)); + var val = Marshal.ReadInt64(pointer, offset); + return *(double*)&val; } internal static unsafe float ReadSingle(IntPtr pointer, int offset) { - return *((float*)((byte*)pointer.ToPointer() + offset)); + var val = Marshal.ReadInt32(pointer, offset); + return *(float*)&val; } - internal static unsafe long ReadInt64(IntPtr pointer, int offset) + internal static long ReadInt64(IntPtr pointer, int offset) { - return *((long*)((byte*)pointer.ToPointer() + offset)); + return Marshal.ReadInt64(pointer, offset); } - internal static unsafe int ReadInt32(IntPtr pointer, int offset) + internal static int ReadInt32(IntPtr pointer, int offset) { - return *((int*)((byte*)pointer.ToPointer() + offset)); + return Marshal.ReadInt32(pointer, offset); } internal static unsafe short ReadInt16(IntPtr pointer, int offset) { From 93de5283085feaf3b5bb2f36b0a1076a5572aa98 Mon Sep 17 00:00:00 2001 From: Sangwook Kim Date: Fri, 7 Feb 2020 10:15:36 +0900 Subject: [PATCH 2/2] Use Unsafe.ReadUnaligned instead of Marshal.Read* - System.Runtime.CompilerServices.Unsafe is added as a new dependency. --- src/PerfView/PerfView.csproj | 7 +++++++ src/TraceEvent/TraceEvent.cs | 15 +++++++-------- src/TraceEvent/TraceEvent.csproj | 1 + 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/PerfView/PerfView.csproj b/src/PerfView/PerfView.csproj index 8815c8665..02a1dbc08 100644 --- a/src/PerfView/PerfView.csproj +++ b/src/PerfView/PerfView.csproj @@ -254,6 +254,13 @@ System.Reflection.Metadata.dll False + + Non-Resx + false + .\System.Runtime.CompilerServices.Unsafe.dll + System.Runtime.CompilerServices.Unsafe.dll + False + Non-Resx false diff --git a/src/TraceEvent/TraceEvent.cs b/src/TraceEvent/TraceEvent.cs index 34de90c29..1414313d6 100644 --- a/src/TraceEvent/TraceEvent.cs +++ b/src/TraceEvent/TraceEvent.cs @@ -15,6 +15,7 @@ #endif using System.IO; using System.Reflection; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; using Address = System.UInt64; @@ -4368,21 +4369,19 @@ internal static unsafe Guid ReadGuid(IntPtr pointer, int offset) } internal static unsafe double ReadDouble(IntPtr pointer, int offset) { - var val = Marshal.ReadInt64(pointer, offset); - return *(double*)&val; + return Unsafe.ReadUnaligned((byte*)pointer.ToPointer() + offset); } internal static unsafe float ReadSingle(IntPtr pointer, int offset) { - var val = Marshal.ReadInt32(pointer, offset); - return *(float*)&val; + return Unsafe.ReadUnaligned((byte*)pointer.ToPointer() + offset); } - internal static long ReadInt64(IntPtr pointer, int offset) + internal static unsafe long ReadInt64(IntPtr pointer, int offset) { - return Marshal.ReadInt64(pointer, offset); + return Unsafe.ReadUnaligned((byte*)pointer.ToPointer() + offset); } - internal static int ReadInt32(IntPtr pointer, int offset) + internal static unsafe int ReadInt32(IntPtr pointer, int offset) { - return Marshal.ReadInt32(pointer, offset); + return Unsafe.ReadUnaligned((byte*)pointer.ToPointer() + offset); } internal static unsafe short ReadInt16(IntPtr pointer, int offset) { diff --git a/src/TraceEvent/TraceEvent.csproj b/src/TraceEvent/TraceEvent.csproj index 079957daf..97bb4a419 100644 --- a/src/TraceEvent/TraceEvent.csproj +++ b/src/TraceEvent/TraceEvent.csproj @@ -68,6 +68,7 @@ +