CustomAttribute.DecodeValue doesn't handle generic type instantiations
- Dominant language
- C#
- Stars
- 18.3k
- Forks
- 5.6k
- PR merge metrics
- PR metrics pending
Description
Following program throws BadImageFormatException because `CustomAttributeDecoder.DecodeFixedArgumentType` doesn't handle `SignatureTypeCode.GenericTypeInstance`.
```csharp
using System;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
unsafe class Program
{
static void Main()
{
typeof(ClassWithGenericEnumAttribute).Assembly.TryGetRawMetadata(out byte* blob, out int length);
var reader = new MetadataReader(blob, length);
var def = reader.GetTypeDefinition(MetadataTokens.TypeDefinitionHandle(typeof(ClassWithGenericEnumAttribute).MetadataToken));
foreach (var attr in def.GetCustomAttributes())
{
reader.GetCustomAttribute(attr).DecodeValue(new CustomAttributeTypeProvider());
}
}
}
internal class CustomAttributeTypeProvider : ICustomAttributeTypeProvider
{
public object GetPrimitiveType(PrimitiveTypeCode typeCode) => throw new NotImplementedException();
public object GetSystemType() => throw new NotImplementedException();
public object GetSZArrayType(object elementType) => throw new NotImplementedException();
public object GetTypeFromDefinition(MetadataReader reader, TypeDefinitionHandle handle, byte rawTypeKind) => throw new NotImplementedException();
public object GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind) => throw new NotImplementedException();
public object GetTypeFromSerializedName(string name) => throw new NotImplementedException();
public PrimitiveTypeCode GetUnderlyingEnumType(object type) => throw new NotImplementedException();
public bool IsSystemType(object type) => throw new NotImplementedException();
}
class GenericEnumAttributeWithFunctionPointer : Attribute
{
public unsafe GenericEnumAttributeWithFunctionPointer(GenericClassForEnum[]>.E e) { }
}
class GenericClassForEnum
{
public enum E { }
}
[GenericEnumAttributeWithFunctionPointer(default)]
unsafe class ClassWithGenericEnumAttribute { }
```
Contributor guide
Assessment
This issue has not been assessed yet.