From bcfa2590fc31443a579b2312f58abb8397db82e7 Mon Sep 17 00:00:00 2001 From: Lee Culver Date: Tue, 16 Jun 2026 09:10:43 -0400 Subject: [PATCH 1/2] Fix failing OSX cDac test --- .../TargetFieldExtensions.cs | 6 +++++- .../managed/cdac/tests/UnitTests/ObjectiveCMarshalTests.cs | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/TargetFieldExtensions.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/TargetFieldExtensions.cs index dd861df2f2d531..cbf2ddadeb7a7c 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/TargetFieldExtensions.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/TargetFieldExtensions.cs @@ -212,8 +212,12 @@ private static void AssertPrimitiveType(Target.FieldInfo field, string fieldN [Conditional("DEBUG")] private static void AssertPointerType(Target.FieldInfo field, string fieldName) { + // Managed types express raw pointers as IntPtr/UIntPtr, which the contract descriptor + // reports as "nint"/"nuint" (there is no way to mark a managed field as "pointer"). + // Accept those in addition to "pointer" so pointer-valued fields on managed types can be + // read via ReadPointer, which reads the value unsigned at full pointer width. Debug.Assert( - field.TypeName is null or "" or "pointer", + field.TypeName is null or "" or "pointer" or "nint" or "nuint", $"Type mismatch reading field '{fieldName}': declared as '{field.TypeName}', expected pointer"); } diff --git a/src/native/managed/cdac/tests/UnitTests/ObjectiveCMarshalTests.cs b/src/native/managed/cdac/tests/UnitTests/ObjectiveCMarshalTests.cs index 47c8a826a3eecd..5b73dc2e2a3330 100644 --- a/src/native/managed/cdac/tests/UnitTests/ObjectiveCMarshalTests.cs +++ b/src/native/managed/cdac/tests/UnitTests/ObjectiveCMarshalTests.cs @@ -71,12 +71,14 @@ private static TestPlaceholderTarget CreateObjectiveCMarshalTargetWithCWT( }; // Register ObjcTrackingInformation type with a single pointer-sized _memory field at offset 0. + // The managed _memory field is an IntPtr, so the contract descriptor reports its type as "nint"; + // model that here so the pointer read path is validated against the real descriptor type. var trackingInfoType = new Target.TypeInfo { Size = (uint)helpers.PointerSize, Fields = new Dictionary { - ["_memory"] = new Target.FieldInfo { Offset = 0 } + ["_memory"] = new Target.FieldInfo { Offset = 0, TypeName = "nint" } } }; From 60c50dd13c5657c99e5cd999cd5524b0f097123a Mon Sep 17 00:00:00 2001 From: Lee Culver Date: Tue, 16 Jun 2026 09:23:30 -0400 Subject: [PATCH 2/2] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../TargetFieldExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/TargetFieldExtensions.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/TargetFieldExtensions.cs index cbf2ddadeb7a7c..3f126b71224747 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/TargetFieldExtensions.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/TargetFieldExtensions.cs @@ -212,8 +212,8 @@ private static void AssertPrimitiveType(Target.FieldInfo field, string fieldN [Conditional("DEBUG")] private static void AssertPointerType(Target.FieldInfo field, string fieldName) { - // Managed types express raw pointers as IntPtr/UIntPtr, which the contract descriptor - // reports as "nint"/"nuint" (there is no way to mark a managed field as "pointer"). + // Managed field signatures report IntPtr/UIntPtr as native ints, which the contract descriptor maps to + // "nint"/"nuint" (as distinct from raw pointer element types which map to "pointer"). // Accept those in addition to "pointer" so pointer-valued fields on managed types can be // read via ReadPointer, which reads the value unsigned at full pointer width. Debug.Assert(