Last active
September 9, 2022 10:25
-
-
Save EgorBo/aeaaae0755c2dfa04320b2a9372b900e to your computer and use it in GitHub Desktop.
AddrSan.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Runtime.CompilerServices; | |
using System.Runtime.InteropServices; | |
using System.Runtime.Intrinsics; | |
unsafe class Program | |
{ | |
[DllImport("kernel32")] | |
static extern byte* VirtualAlloc(IntPtr addr, nuint size, uint typ, uint prot); | |
static void Main() | |
{ | |
// Case 1: pass 50 elements of a managed array | |
int[] data = new int[50]; | |
Foo(ref data[0], 50); | |
// Case 2: same amount of memory, just allocated at the page boundary | |
uint length = (uint)Environment.SystemPageSize; | |
byte* ptr = VirtualAlloc(IntPtr.Zero, length, 0x1000 | 0x2000 /* reserve commit */, 0x04); | |
ref int pointer = ref Unsafe.AsRef<int>(ptr + length - 50 * sizeof(int)); | |
// pointer pointing to exactly 50 ints (200 bytes) | |
Foo(ref pointer, 50); | |
} | |
static void Foo(ref int data, nuint length) | |
{ | |
// This algorithm has a bug, it reads more than needed for last vector | |
for (nuint i = 0; i < length; i += (nuint)Vector128<int>.Count) | |
{ | |
Vector128<int> vec = Vector128.LoadUnsafe(ref data, i); | |
vec += Vector128.Create(1); | |
vec.StoreUnsafe(ref data, i); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment