Skip to content

Commit

Permalink
Address remaining warnings from DataContractSerialization (#51200)
Browse files Browse the repository at this point in the history
* Address remaining warnings from DataContractSerialization

* Refactor MemberTypes declaration

* Remove Unused UnconditionalSuppressMessages

* Addressing some PR Feedback

* Suppress MakeGenericMethod calls in AccessorBuilder

* Suppressing error in NullPrimitiveDataContract constructor

* Suppress other MakeGenericMethod linker warnings

* Address remaining feedback and move trimmer string to DataContract

* Addressing some nits

* Fix typo and remove unnecesary usings
  • Loading branch information
joperezr authored Apr 19, 2021
1 parent 1f89aba commit 989ba28
Show file tree
Hide file tree
Showing 55 changed files with 960 additions and 561 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
Expand All @@ -23,12 +24,18 @@ internal static class FastInvokerBuilder
private static readonly MethodInfo s_createSetterInternal = typeof(FastInvokerBuilder).GetMethod(nameof(CreateSetterInternal), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static)!;
private static readonly MethodInfo s_make = typeof(FastInvokerBuilder).GetMethod(nameof(Make), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static)!;

public static Func<object> GetMakeNewInstanceFunc(Type type)
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod",
Justification = "The call to MakeGenericMethod is safe due to the fact that we are preserving the constructors of type which is what Make() is doing.")]
public static Func<object> GetMakeNewInstanceFunc(
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
Type type)
{
Func<object> make = s_make.MakeGenericMethod(type).CreateDelegate<Func<object>>();
return make;
}

[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod",
Justification = "The call to MakeGenericMethod is safe due to the fact that FastInvokerBuilder.CreateGetterInternal<T, T1> is not annotated.")]
public static Getter CreateGetter(MemberInfo memberInfo)
{
if (memberInfo is PropertyInfo propInfo)
Expand All @@ -51,6 +58,8 @@ public static Getter CreateGetter(MemberInfo memberInfo)
}
}

[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod",
Justification = "The call to MakeGenericMethod is safe due to the fact that FastInvokerBuilder.CreateSetterInternal<T, T1> is not annotated.")]
public static Setter CreateSetter(MemberInfo memberInfo)
{
if (memberInfo is PropertyInfo)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,21 @@ internal sealed class ClassDataContract : DataContract

private bool _isScriptObject;

internal const DynamicallyAccessedMemberTypes DataContractPreserveMemberTypes =
DynamicallyAccessedMemberTypes.PublicMethods |
DynamicallyAccessedMemberTypes.NonPublicMethods |
DynamicallyAccessedMemberTypes.PublicConstructors |
DynamicallyAccessedMemberTypes.NonPublicConstructors |
DynamicallyAccessedMemberTypes.PublicFields |
DynamicallyAccessedMemberTypes.PublicProperties;

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
internal ClassDataContract(Type type) : base(new ClassDataContractCriticalHelper(type))
{
InitClassDataContract();
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
private ClassDataContract(Type type, XmlDictionaryString ns, string[] memberNames) : base(new ClassDataContractCriticalHelper(type, ns, memberNames))
{
InitClassDataContract();
Expand Down Expand Up @@ -65,6 +75,7 @@ internal List<DataMember>? Members

public XmlDictionaryString?[]? ChildElementNamespaces
{
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
get
{
if (_childElementNamespaces == null)
Expand Down Expand Up @@ -122,6 +133,7 @@ internal MethodInfo? ExtensionDataSetMethod

public override DataContractDictionary? KnownDataContracts
{
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
get
{ return _helper.KnownDataContracts; }
}
Expand Down Expand Up @@ -228,13 +240,15 @@ internal bool CreateNewInstanceViaDefaultConstructor([NotNullWhen(true)] out obj
return true;
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
private XmlFormatClassWriterDelegate CreateXmlFormatWriterDelegate()
{
return new XmlFormatWriterGenerator().GenerateClassWriter(this);
}

internal XmlFormatClassWriterDelegate XmlFormatWriterDelegate
{
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
get
{
if (_helper.XmlFormatWriterDelegate == null)
Expand All @@ -256,13 +270,15 @@ internal XmlFormatClassWriterDelegate XmlFormatWriterDelegate
}
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
private XmlFormatClassReaderDelegate CreateXmlFormatReaderDelegate()
{
return new XmlFormatReaderGenerator().GenerateClassReader(this);
}

internal XmlFormatClassReaderDelegate XmlFormatReaderDelegate
{
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
get
{
if (_helper.XmlFormatReaderDelegate == null)
Expand All @@ -284,6 +300,7 @@ internal XmlFormatClassReaderDelegate XmlFormatReaderDelegate
}
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
internal static ClassDataContract CreateClassDataContractForKeyValue(Type type, XmlDictionaryString ns, string[] memberNames)
{
ClassDataContract? cdc = (ClassDataContract?)DataContract.GetDataContractFromGeneratedAssembly(type);
Expand Down Expand Up @@ -317,6 +334,7 @@ internal static void CheckAndAddMember(List<DataMember> members, DataMember memb
members.Add(memberContract);
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
internal static XmlDictionaryString? GetChildNamespaceToDeclare(DataContract dataContract, Type childType, XmlDictionary dictionary)
{
childType = DataContract.UnwrapNullableType(childType);
Expand All @@ -342,7 +360,9 @@ private static bool IsArraySegment(Type t)
/// is therefore marked SRR
/// Safe - does not let caller influence isNonAttributedType calculation; no harm in leaking value
/// </SecurityNote>
internal static bool IsNonAttributedTypeValidForSerialization(Type type)
internal static bool IsNonAttributedTypeValidForSerialization(
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
Type type)
{
if (type.IsArray)
return false;
Expand Down Expand Up @@ -437,6 +457,7 @@ internal static bool IsNonSerializedMember(Type type, string memberName)
&& members.Contains(memberName);
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
private XmlDictionaryString?[]? CreateChildElementNamespaces()
{
if (Members == null)
Expand Down Expand Up @@ -464,6 +485,7 @@ private void EnsureMethodsImported()
_helper.EnsureMethodsImported();
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
public override void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext? context)
{
Debug.Assert(context != null);
Expand All @@ -475,6 +497,7 @@ public override void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, Xml
XmlFormatWriterDelegate(xmlWriter, obj, context, this);
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
public override object? ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext? context)
{
if (_isScriptObject)
Expand Down Expand Up @@ -711,7 +734,9 @@ private sealed class ClassDataContractCriticalHelper : DataContract.DataContract
public XmlDictionaryString[]? MemberNames;
public XmlDictionaryString[]? MemberNamespaces;

internal ClassDataContractCriticalHelper(Type type) : base(type)
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
internal ClassDataContractCriticalHelper([DynamicallyAccessedMembers(DataContractPreserveMemberTypes)]
Type type) : base(type)
{
XmlQualifiedName stableName = GetStableNameAndSetHasDataContract(type);
if (type == Globals.TypeOfDBNull)
Expand Down Expand Up @@ -823,7 +848,10 @@ internal ClassDataContractCriticalHelper(Type type) : base(type)
Globals.TypeOfScriptObject_IsAssignableFrom(this.UnderlyingType);
}

internal ClassDataContractCriticalHelper(Type type, XmlDictionaryString ns, string[] memberNames) : base(type)
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
internal ClassDataContractCriticalHelper(
[DynamicallyAccessedMembers(DataContractPreserveMemberTypes)]
Type type, XmlDictionaryString ns, string[] memberNames) : base(type)
{
this.StableName = new XmlQualifiedName(GetStableNameAndSetHasDataContract(type).Name, ns.Value);
ImportDataMembers();
Expand Down Expand Up @@ -896,6 +924,7 @@ private void EnsureIsReferenceImported(Type type)

[MemberNotNull(nameof(_members))]
[MemberNotNull(nameof(Members))]
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
private void ImportDataMembers()
{
Type type = this.UnderlyingType;
Expand Down Expand Up @@ -1075,6 +1104,7 @@ private static bool CanSerializeMember(FieldInfo? field)
return field != null && !ClassDataContract.IsNonSerializedMember(field.DeclaringType!, field.Name);
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
private bool SetIfGetOnlyCollection(DataMember memberContract)
{
//OK to call IsCollection here since the use of surrogated collection types is not supported in get-only scenarios
Expand Down Expand Up @@ -1148,6 +1178,7 @@ private void SetIfMembersHaveConflict(List<DataMember> members)
}
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
private XmlQualifiedName GetStableNameAndSetHasDataContract(Type type)
{
return DataContract.GetStableName(type, out _hasDataContract);
Expand All @@ -1160,7 +1191,9 @@ private XmlQualifiedName GetStableNameAndSetHasDataContract(Type type)
/// is dependent on the correct calculation of hasDataContract
/// Safe - does not let caller influence isNonAttributedType calculation; no harm in leaking value
/// </SecurityNote>
private void SetIsNonAttributedType(Type type)
private void SetIsNonAttributedType(
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
Type type)
{
_isNonAttributedType = !type.IsSerializable && !_hasDataContract && IsNonAttributedTypeValidForSerialization(type);
}
Expand Down Expand Up @@ -1314,6 +1347,8 @@ internal MethodInfo? ExtensionDataSetMethod

internal override DataContractDictionary? KnownDataContracts
{

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
get
{
if (_knownDataContracts != null)
Expand Down Expand Up @@ -1362,7 +1397,10 @@ internal bool IsNonAttributedType
get { return _isNonAttributedType; }
}

private void SetKeyValuePairAdapterFlags(Type type)
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
private void SetKeyValuePairAdapterFlags(
[DynamicallyAccessedMembers(DataContractPreserveMemberTypes)]
Type type)
{
if (type.IsGenericType && type.GetGenericTypeDefinition() == Globals.TypeOfKeyValuePairAdapter)
{
Expand Down Expand Up @@ -1491,6 +1529,7 @@ public int Compare(Member x, Member y)
internal static DataMemberConflictComparer Singleton = new DataMemberConflictComparer();
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
internal ClassDataContractCriticalHelper Clone()
{
ClassDataContractCriticalHelper clonedHelper = new ClassDataContractCriticalHelper(this.UnderlyingType);
Expand Down Expand Up @@ -1552,6 +1591,7 @@ internal Type ObjectType
}
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
internal ClassDataContract Clone()
{
ClassDataContract clonedDc = new ClassDataContract(this.UnderlyingType);
Expand All @@ -1565,6 +1605,7 @@ internal ClassDataContract Clone()
return clonedDc;
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
internal void UpdateNamespaceAndMembers(Type type, XmlDictionaryString ns, string[] memberNames)
{
this.StableName = new XmlQualifiedName(GetStableName(type).Name, ns.Value);
Expand Down
Loading

0 comments on commit 989ba28

Please sign in to comment.