Safely handle null pointers in `Util.UnsafeSpanFromPointer`

This commit is contained in:
YoshiRulz 2025-05-25 07:44:59 +10:00
parent 2441dd1223
commit 984957a4f7
No known key found for this signature in database
GPG Key ID: C4DE31C245353FB7
2 changed files with 10 additions and 11 deletions

View File

@ -287,24 +287,24 @@ namespace BizHawk.Common
}
/// <summary>creates span over <paramref name="length"/> octets starting at <paramref name="ptr"/></summary>
/// <remarks>returns empty span if <paramref name="ptr"/> is the null pointer (<see cref="IntPtr.Zero"/>)</remarks>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe Span<byte> UnsafeSpanFromPointer(IntPtr ptr, int length)
{
return new(pointer: ptr.ToPointer(), length: length);
}
=> ptr == IntPtr.Zero ? [ ] : new(pointer: ptr.ToPointer(), length: length);
#if false // unused
/// <summary>
/// creates span over <paramref name="count"/><c> * sizeof(</c><typeparamref name="T"/><c>)</c> octets
/// starting at <paramref name="ptr"/>
/// </summary>
/// <remarks>uses native endianness and <paramref name="ptr"/> must be aligned (else UB)</remarks>
/// <remarks>
/// uses native endianness and <paramref name="ptr"/> must be aligned (else UB);
/// returns empty span if <paramref name="ptr"/> is the null pointer (<see cref="IntPtr.Zero"/>)
/// </remarks>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe Span<T> UnsafeSpanFromPointerAligned<T>(IntPtr ptr, int count)
where T : unmanaged
{
return new(pointer: ptr.ToPointer(), length: count * sizeof(T));
}
=> ptr == IntPtr.Zero ? [ ] : new(pointer: ptr.ToPointer(), length: count * sizeof(T));
#endif
public static void WriteByteBuffer(this BinaryWriter bw, byte[]? data)

View File

@ -72,10 +72,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.N3DS
}
private Span<byte> GetPage(uint addr)
{
var pagePointer = _core.Encore_GetPagePointer(_context, addr);
return pagePointer == IntPtr.Zero ? [ ] : Util.UnsafeSpanFromPointer(pagePointer, (int)(ENCORE_PAGE_SIZE - (addr & ENCORE_PAGE_MASK)));
}
=> Util.UnsafeSpanFromPointer(
ptr: _core.Encore_GetPagePointer(_context, addr: addr),
length: (int) (ENCORE_PAGE_SIZE - (addr & ENCORE_PAGE_MASK)));
public override byte PeekByte(long addr)
{