From 1d674abffe7ecd734b49f7b5fd838900ab1c5ac5 Mon Sep 17 00:00:00 2001 From: Ella Hathaway <67609881+ellahathaway@users.noreply.github.com> Date: Mon, 11 Dec 2023 14:14:13 -0800 Subject: [PATCH] Fix attribute type checking and use null-conditional operator (#17902) --- .../CheckForPoison.cs | 21 ++++++++++++++----- .../DummyAttributeTypeProvider.cs | 21 +++++++++++-------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/SourceBuild/content/eng/tools/tasks/Microsoft.DotNet.SourceBuild.Tasks.LeakDetection/CheckForPoison.cs b/src/SourceBuild/content/eng/tools/tasks/Microsoft.DotNet.SourceBuild.Tasks.LeakDetection/CheckForPoison.cs index dab29fae4..1c0eefc9e 100644 --- a/src/SourceBuild/content/eng/tools/tasks/Microsoft.DotNet.SourceBuild.Tasks.LeakDetection/CheckForPoison.cs +++ b/src/SourceBuild/content/eng/tools/tasks/Microsoft.DotNet.SourceBuild.Tasks.LeakDetection/CheckForPoison.cs @@ -347,7 +347,8 @@ namespace Microsoft.DotNet.SourceBuild.Tasks.LeakDetection using var peReader = new PEReader(stream); MetadataReader reader = peReader.GetMetadataReader(); - return reader.CustomAttributes.Select(attrHandle => reader.GetCustomAttribute(attrHandle)) + return reader.CustomAttributes + .Select(attrHandle => reader.GetCustomAttribute(attrHandle)) .Any(attr => IsAttributeSbrp(reader, attr)); } @@ -357,13 +358,23 @@ namespace Microsoft.DotNet.SourceBuild.Tasks.LeakDetection if (attr.Constructor.Kind == HandleKind.MemberReference) { - MemberReference mref = reader.GetMemberReference((MemberReferenceHandle)attr.Constructor); - + var mref = reader.GetMemberReference((MemberReferenceHandle)attr.Constructor); if (mref.Parent.Kind == HandleKind.TypeReference) { - TypeReference tref = reader.GetTypeReference((TypeReferenceHandle)mref.Parent); + var tref = reader.GetTypeReference((TypeReferenceHandle)mref.Parent); attributeType = $"{reader.GetString(tref.Namespace)}.{reader.GetString(tref.Name)}"; } + else if (mref.Parent.Kind == HandleKind.TypeDefinition) + { + var tdef = reader.GetTypeDefinition((TypeDefinitionHandle)mref.Parent); + attributeType = $"{reader.GetString(tdef.Namespace)}.{reader.GetString(tdef.Name)}"; + } + } + else if (attr.Constructor.Kind == HandleKind.MethodDefinition) + { + var mdef = reader.GetMethodDefinition((MethodDefinitionHandle)attr.Constructor); + var tdef = reader.GetTypeDefinition(mdef.GetDeclaringType()); + attributeType = $"{reader.GetString(tdef.Namespace)}.{reader.GetString(tdef.Name)}"; } if (attributeType == SbrpAttributeType) @@ -371,7 +382,7 @@ namespace Microsoft.DotNet.SourceBuild.Tasks.LeakDetection var decodedValue = attr.DecodeValue(DummyAttributeTypeProvider.Instance); try { - return decodedValue.FixedArguments[0].Value.ToString() == "source" && decodedValue.FixedArguments[1].Value.ToString() == "source-build-reference-packages"; + return decodedValue.FixedArguments[0].Value?.ToString() == "source" && decodedValue.FixedArguments[1].Value?.ToString() == "source-build-reference-packages"; } catch { diff --git a/src/SourceBuild/content/eng/tools/tasks/Microsoft.DotNet.SourceBuild.Tasks.LeakDetection/DummyAttributeTypeProvider.cs b/src/SourceBuild/content/eng/tools/tasks/Microsoft.DotNet.SourceBuild.Tasks.LeakDetection/DummyAttributeTypeProvider.cs index 6f352c88b..158f9cddf 100644 --- a/src/SourceBuild/content/eng/tools/tasks/Microsoft.DotNet.SourceBuild.Tasks.LeakDetection/DummyAttributeTypeProvider.cs +++ b/src/SourceBuild/content/eng/tools/tasks/Microsoft.DotNet.SourceBuild.Tasks.LeakDetection/DummyAttributeTypeProvider.cs @@ -7,28 +7,31 @@ using System.Reflection; using System.Reflection.Metadata; using System.Reflection.Metadata.Ecma335; +#nullable enable + namespace Microsoft.DotNet.SourceBuild.Tasks.LeakDetection { // An empty ICustomAttributeTypeProvider implementation is necessary to read metadata attribute values. - internal class DummyAttributeTypeProvider : ICustomAttributeTypeProvider + internal class DummyAttributeTypeProvider : ICustomAttributeTypeProvider { public static readonly DummyAttributeTypeProvider Instance = new(); - public Type GetPrimitiveType(PrimitiveTypeCode typeCode) => default(Type); + public Type? GetPrimitiveType(PrimitiveTypeCode typeCode) => default(Type); - public Type GetSystemType() => default(Type); + public Type? GetSystemType() => default(Type); - public Type GetSZArrayType(Type elementType) => default(Type); + public Type? GetSZArrayType(Type? elementType) => default(Type); - public Type GetTypeFromDefinition(MetadataReader reader, TypeDefinitionHandle handle, byte rawTypeKind) => default(Type); + public Type? GetTypeFromDefinition(MetadataReader reader, TypeDefinitionHandle handle, byte rawTypeKind) => default(Type); - public Type GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind) => default(Type); + public Type? GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind) => default(Type); - public Type GetTypeFromSerializedName(string name) => default(Type); + public Type? GetTypeFromSerializedName(string name) => default(Type); - public PrimitiveTypeCode GetUnderlyingEnumType(Type type) => default(PrimitiveTypeCode); + public PrimitiveTypeCode GetUnderlyingEnumType(Type? type) => default(PrimitiveTypeCode); - public bool IsSystemType(Type type) => default(bool); + public bool IsSystemType(Type? type) => default(bool); } } +