From 05c57800fa0eaae397cbb2cd07cca9aee2442366 Mon Sep 17 00:00:00 2001 From: Youssef1313 Date: Thu, 26 May 2022 20:27:56 +0200 Subject: [PATCH 1/7] Fix VB compiler crashes when decoding attributes --- .../Symbols/Attributes/AttributeData.vb | 59 ++-- .../Symbols/Source/SourceMethodSymbol.vb | 12 +- .../AttributeTests_WellKnownAttributes.vb | 292 +++++++++++++++++- 3 files changed, 326 insertions(+), 37 deletions(-) diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb b/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb index 263ba82b4fdb5..bd47348d59096 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb @@ -243,9 +243,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols diagnostics.Add(If(nodeOpt IsNot Nothing, nodeOpt.Name.GetLocation, NoLocation.Singleton), useSiteInfo) End If - ' BC31205: First argument to a security attribute must be a valid SecurityAction - diagnostics.Add(ErrorFactory.ErrorInfo(ERRID.ERR_SecurityAttributeMissingAction, - Me.AttributeClass), + ' BC31211: First argument to a security attribute must be a valid SecurityAction + diagnostics.Add(ErrorFactory.ErrorInfo(ERRID.ERR_SecurityAttributeMissingAction), If(nodeOpt IsNot Nothing, nodeOpt.Name.GetLocation, NoLocation.Singleton)) hasErrors = True @@ -253,6 +252,19 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Return Nothing End Function + Private Function GetArgumentAndLocation(nodeOpt As AttributeSyntax, value As Integer) As (Argument As String, Location As Location) + If nodeOpt IsNot Nothing Then + If nodeOpt.ArgumentList IsNot Nothing AndAlso nodeOpt.ArgumentList.Arguments.Count > 0 Then + Dim arg = nodeOpt.ArgumentList.Arguments(0) + Return (arg.ToString(), arg.GetLocation()) + Else + Return (value.ToString(), nodeOpt.GetLocation()) + End If + Else + Return ("", NoLocation.Singleton) + End If + End Function + Private Function ValidateSecurityAction( typedValue As TypedConstant, targetSymbol As Symbol, @@ -271,10 +283,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols DeclarativeSecurityAction.LinkDemand If Me.IsTargetAttribute(targetSymbol, AttributeDescription.PrincipalPermissionAttribute) Then - ' BC31209: SecurityAction value '{0}' is invalid for PrincipalPermission attribute - diagnostics.Add(ERRID.ERR_PrincipalPermissionInvalidAction, - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).GetLocation(), NoLocation.Singleton), - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).ToString(), "")) + ' BC31215: SecurityAction value '{0}' is invalid for PrincipalPermission attribute + Dim valueLocation = GetArgumentAndLocation(nodeOpt, securityAction) + diagnostics.Add(ERRID.ERR_PrincipalPermissionInvalidAction, valueLocation.Location, valueLocation.Argument) hasErrors = True Return DeclarativeSecurityAction.None @@ -301,11 +312,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols isPermissionRequestAction = True Case Else - ' BC31206: Security attribute '{0}' has an invalid SecurityAction value '{1}' - diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).GetLocation(), NoLocation.Singleton), - If(nodeOpt IsNot Nothing, nodeOpt.Name.ToString, ""), - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).ToString(), "")) + ' BC31214: SecurityAction value '{0}' is invalid for security attributes applied to a type or a method. + Dim valueLocation = GetArgumentAndLocation(nodeOpt, securityAction) + diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, valueLocation.Location, valueLocation.Argument) hasErrors = True Return DeclarativeSecurityAction.None @@ -315,10 +324,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If targetSymbol.Kind = SymbolKind.NamedType OrElse targetSymbol.Kind = SymbolKind.Method Then ' Types and methods cannot take permission requests. - ' BC31208: SecurityAction value '{0}' is invalid for security attributes applied to a type or a method - diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).GetLocation, NoLocation.Singleton), - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).ToString(), "")) + ' BC31214: SecurityAction value '{0}' is invalid for security attributes applied to a type or a method. + Dim valueLocation = GetArgumentAndLocation(nodeOpt, securityAction) + diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, valueLocation.Location, valueLocation.Argument) hasErrors = True Return DeclarativeSecurityAction.None @@ -327,10 +335,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ElseIf targetSymbol.Kind = SymbolKind.Assembly Then ' Assemblies cannot take declarative security. - ' BC31207: SecurityAction value '{0}' is invalid for security attributes applied to an assembly - diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionAssembly, - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).GetLocation, NoLocation.Singleton), - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).ToString(), "")) + ' BC31213: SecurityAction value '{0}' is invalid for security attributes applied to an assembly. + Dim valueLocation = GetArgumentAndLocation(nodeOpt, securityAction) + diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionAssembly, valueLocation.Location, valueLocation.Argument) hasErrors = True Return DeclarativeSecurityAction.None @@ -376,7 +383,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If resolvedFilePath Is Nothing Then - ' BC31210: Unable to resolve file path '{0}' specified for the named argument '{1}' for PermissionSet attribute + ' BC31216: Unable to resolve file path '{0}' specified for the named argument '{1}' for PermissionSet attribute. Dim argSyntaxLocation As Location = If(arguments.AttributeSyntaxOpt IsNot Nothing, arguments.AttributeSyntaxOpt.ArgumentList.Arguments(1).GetLocation(), NoLocation.Singleton) @@ -429,14 +436,18 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Case ClassInterfaceType.None, Cci.Constants.ClassInterfaceType_AutoDispatch, Cci.Constants.ClassInterfaceType_AutoDual Exit Select Case Else - diagnostics.Add(ERRID.ERR_BadAttribute1, If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).GetLocation(), NoLocation.Singleton), Me.AttributeClass) + diagnostics.Add(ERRID.ERR_BadAttribute1, + If(nodeOpt IsNot Nothing, If(nodeOpt.ArgumentList IsNot Nothing AndAlso nodeOpt.ArgumentList.Arguments.Count > 0, nodeOpt.ArgumentList.Arguments(0).GetLocation(), nodeOpt.GetLocation()), NoLocation.Singleton), + Me.AttributeClass) End Select End Sub Friend Sub DecodeInterfaceTypeAttribute(node As AttributeSyntax, diagnostics As BindingDiagnosticBag) Dim discarded As ComInterfaceType = Nothing If Not DecodeInterfaceTypeAttribute(discarded) Then - diagnostics.Add(ERRID.ERR_BadAttribute1, node.ArgumentList.Arguments(0).GetLocation(), Me.AttributeClass) + diagnostics.Add(ERRID.ERR_BadAttribute1, + If(node IsNot Nothing, If(node.ArgumentList IsNot Nothing AndAlso node.ArgumentList.Arguments.Count > 0, node.ArgumentList.Arguments(0).GetLocation(), node.GetLocation()), NoLocation.Singleton), + Me.AttributeClass) End If End Sub @@ -478,7 +489,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Dim guidVal As Guid If Not Guid.TryParseExact(guidString, "D", guidVal) Then diagnostics.Add(ERRID.ERR_BadAttributeUuid2, - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).GetLocation(), NoLocation.Singleton), + If(nodeOpt IsNot Nothing, If(nodeOpt.ArgumentList IsNot Nothing AndAlso nodeOpt.ArgumentList.Arguments.Count > 0, nodeOpt.ArgumentList.Arguments(0).GetLocation(), nodeOpt.GetLocation()), NoLocation.Singleton), Me.AttributeClass, If(guidString, ObjectDisplay.NullLiteral)) End If End Sub diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb index fb05b9650cd15..7ed7b774be58b 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb @@ -1651,7 +1651,17 @@ lReportErrorOnTwoTokens: Dim moduleName As String = TryCast(attrData.CommonConstructorArguments(0).ValueInternal, String) If Not MetadataHelpers.IsValidMetadataIdentifier(moduleName) Then - diagnostics.Add(ERRID.ERR_BadAttribute1, arguments.AttributeSyntaxOpt.ArgumentList.Arguments(0).GetLocation(), attrData.AttributeClass) + Dim location As Location + If arguments.AttributeSyntaxOpt IsNot Nothing Then + If arguments.AttributeSyntaxOpt.ArgumentList IsNot Nothing AndAlso arguments.AttributeSyntaxOpt.ArgumentList.Arguments.Count > 0 Then + location = arguments.AttributeSyntaxOpt.ArgumentList.Arguments(0).GetLocation() + Else + location = arguments.AttributeSyntaxOpt.GetLocation() + End If + Else + location = NoLocation.Singleton + End If + diagnostics.Add(ERRID.ERR_BadAttribute1, location, attrData.AttributeClass) End If ' Default value of charset is inherited from the module (only if specified). diff --git a/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb b/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb index b69e66042eb0b..83006c68d8f5a 100644 --- a/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb +++ b/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb @@ -1092,6 +1092,37 @@ End Class Diagnostic(ERRID.ERR_BadAttribute1, "EntryPoint:=ChrW(&HDC00) & ChrW(&HD800)").WithArguments("System.Runtime.InteropServices.DllImportAttribute")) End Sub + + Public Sub DllImport_InvalidArgs2() + Dim source = + + + Public Shared Sub F1() + End Sub +End Class +]]> + + + CreateCompilationWithMscorlib40AndVBRuntime(source).AssertTheseDiagnostics( + ~~~~~~~~~ +]]>) + End Sub + Public Sub DllImport_SpecialCharactersInName() Dim source = @@ -3763,15 +3794,86 @@ end class Dim comp = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(source) comp.VerifyDiagnostics(Diagnostic(ERRID.ERR_OmittedArgument2, "FileIOPermission").WithArguments("action", "Public Overloads Sub New(action As System.Security.Permissions.SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(0, SecurityAction)").WithArguments("MySecurityAttribute", "DirectCast(0, SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(11, SecurityAction)").WithArguments("MySecurityAttribute", "DirectCast(11, SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(-1, SecurityAction)").WithArguments("MySecurityAttribute", "DirectCast(-1, SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(0, SecurityAction)").WithArguments("FileIOPermission", "DirectCast(0, SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(11, SecurityAction)").WithArguments("FileIOPermission", "DirectCast(11, SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(-1, SecurityAction)").WithArguments("FileIOPermission", "DirectCast(-1, SecurityAction)"), + Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(0, SecurityAction)").WithArguments("DirectCast(0, SecurityAction)"), + Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(11, SecurityAction)").WithArguments("DirectCast(11, SecurityAction)"), + Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(-1, SecurityAction)").WithArguments("DirectCast(-1, SecurityAction)"), + Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(0, SecurityAction)").WithArguments("DirectCast(0, SecurityAction)"), + Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(11, SecurityAction)").WithArguments("DirectCast(11, SecurityAction)"), + Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(-1, SecurityAction)").WithArguments("DirectCast(-1, SecurityAction)"), Diagnostic(ERRID.ERR_InvalidAttributeUsage2, "FileIOPermission").WithArguments("FileIOPermissionAttribute", "Field")) End Sub + + Public Sub TestInvalidSecurityActionErrors_UserDefinedWithOptionalParameterInCtor_PermissionsRequestAction() + Dim source = + + +Class A +End Class +]]> + + + + Dim comp = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(source) + comp.AssertTheseDiagnostics( + ~~~~~~~~~~~~~~~~~~~ +]]>) + End Sub + + + Public Sub TestInvalidSecurityActionErrors_UserDefinedWithOptionalParameterInCtor() + Dim source = + + +Class A +End Class +]]> + + + + Dim comp = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(source) + comp.AssertTheseDiagnostics( + ~~~~~~~~~~~~~~~~~~~ +]]>) + End Sub + Public Sub TestMissingSecurityActionErrors() Dim source = @@ -3812,12 +3914,12 @@ end class Dim comp = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(source) comp.VerifyDiagnostics( - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute").WithArguments("MySecurityAttribute"), - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute").WithArguments("MySecurityAttribute"), - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute").WithArguments("MySecurityAttribute"), - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute").WithArguments("MySecurityAttribute"), - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute").WithArguments("MySecurityAttribute"), - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute").WithArguments("MySecurityAttribute") + Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute"), + Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute"), + Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute"), + Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute"), + Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute"), + Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute") ) End Sub @@ -3895,6 +3997,40 @@ end class Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionAssembly, "SecurityAction.PermitOnly").WithArguments("SecurityAction.PermitOnly")) End Sub + + Public Sub TestInvalidSecurityActionsForAssemblyErrors_UserDefinedWithOptionalParameterInCtor() + Dim source = + + + +Class MySecurityAttribute + Inherits SecurityAttribute + + Public Sub New (Optional a As SecurityAction = 1) + MyBase.New(a) + End Sub + + Public Overrides Function CreatePermission() As IPermission + Return Nothing + End Function +End Class + +]]> + + + + Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(source) + compilation.AssertTheseDiagnostics( + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +]]>) + End Sub + Public Sub TestInvalidSecurityActionForTypeOrMethod() Dim source = @@ -4042,6 +4178,46 @@ End Class Diagnostic(ERRID.ERR_PrincipalPermissionInvalidAction, "SecurityAction.LinkDemand").WithArguments("SecurityAction.LinkDemand")) End Sub + + + Public Sub PrincipalPermissionAttribute_UserDefinedWithOptionalParameterInCtor() + Dim source = + + + Public Shared Sub Main() + End Sub +End Class +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( + ~~~~~~~~~~~~~~~~~~~ +]]>) + End Sub + Public Sub SuppressUnmanagedCodeSecurityAttribute() @@ -4268,6 +4444,36 @@ BC30662: Attribute 'ClassInterfaceAttribute' cannot be applied to 'InvalidTarget ]]>) End Sub + + Public Sub TestClassInterfaceAttribute_UserDefinedWithOptionalParameterInCtor() + Dim source = + + +Public Class InvalidClass +End Class +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( + ~~~~~~~~~~~~~~ +]]>) + End Sub #End Region #Region "InterfaceTypeAttribute, TypeLibTypeAttribute" @@ -4370,6 +4576,37 @@ BC30662: Attribute 'InterfaceTypeAttribute' cannot be applied to 'InvalidTarget' ]]>) End Sub + + Public Sub TestInterfaceTypeAttribute_UserDefinedWithOptionalParameterInCtor() + Dim source = + + +Public Interface InvalidInterface1 +End Interface +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( + ~~~~~~~~~~~~~ +]]>) + End Sub + Public Sub TestIsExtensibleInterface() @@ -6676,5 +6913,36 @@ BC30127: Attribute 'StructLayoutAttribute' is not valid: Incorrect argument valu ]]> ) End Sub + + + Public Sub TestGuidAttribute() + Dim source = + + +Public Class AClass +End Class +]]> + + + + Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(source) + compilation.AssertTheseDiagnostics( + ~~~~ +]]>) + End Sub End Class End Namespace From 69ac80ee94db404ec4a34f5b9b6b2acca04bfbae Mon Sep 17 00:00:00 2001 From: Youssef1313 Date: Fri, 27 May 2022 10:04:15 +0200 Subject: [PATCH 2/7] Simplify per review comment --- .../Symbols/Attributes/AttributeData.vb | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb b/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb index bd47348d59096..4fdbb2599e62a 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb @@ -252,7 +252,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Return Nothing End Function - Private Function GetArgumentAndLocation(nodeOpt As AttributeSyntax, value As Integer) As (Argument As String, Location As Location) + Private Shared Function GetArgumentAndLocation(nodeOpt As AttributeSyntax, value As Integer) As (Argument As String, Location As Location) If nodeOpt IsNot Nothing Then If nodeOpt.ArgumentList IsNot Nothing AndAlso nodeOpt.ArgumentList.Arguments.Count > 0 Then Dim arg = nodeOpt.ArgumentList.Arguments(0) @@ -436,18 +436,16 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Case ClassInterfaceType.None, Cci.Constants.ClassInterfaceType_AutoDispatch, Cci.Constants.ClassInterfaceType_AutoDual Exit Select Case Else - diagnostics.Add(ERRID.ERR_BadAttribute1, - If(nodeOpt IsNot Nothing, If(nodeOpt.ArgumentList IsNot Nothing AndAlso nodeOpt.ArgumentList.Arguments.Count > 0, nodeOpt.ArgumentList.Arguments(0).GetLocation(), nodeOpt.GetLocation()), NoLocation.Singleton), - Me.AttributeClass) + Dim location = GetArgumentAndLocation(nodeOpt).Location + diagnostics.Add(ERRID.ERR_BadAttribute1, location, Me.AttributeClass) End Select End Sub Friend Sub DecodeInterfaceTypeAttribute(node As AttributeSyntax, diagnostics As BindingDiagnosticBag) Dim discarded As ComInterfaceType = Nothing If Not DecodeInterfaceTypeAttribute(discarded) Then - diagnostics.Add(ERRID.ERR_BadAttribute1, - If(node IsNot Nothing, If(node.ArgumentList IsNot Nothing AndAlso node.ArgumentList.Arguments.Count > 0, node.ArgumentList.Arguments(0).GetLocation(), node.GetLocation()), NoLocation.Singleton), - Me.AttributeClass) + Dim location = GetArgumentAndLocation(nodeOpt).Location + diagnostics.Add(ERRID.ERR_BadAttribute1, location, Me.AttributeClass) End If End Sub @@ -488,9 +486,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' Native compiler allows only a specific GUID format: "D" format (32 digits separated by hyphens) Dim guidVal As Guid If Not Guid.TryParseExact(guidString, "D", guidVal) Then - diagnostics.Add(ERRID.ERR_BadAttributeUuid2, - If(nodeOpt IsNot Nothing, If(nodeOpt.ArgumentList IsNot Nothing AndAlso nodeOpt.ArgumentList.Arguments.Count > 0, nodeOpt.ArgumentList.Arguments(0).GetLocation(), nodeOpt.GetLocation()), NoLocation.Singleton), - Me.AttributeClass, If(guidString, ObjectDisplay.NullLiteral)) + Dim location = GetArgumentAndLocation(nodeOpt).Location + diagnostics.Add(ERRID.ERR_BadAttributeUuid2, location, Me.AttributeClass, If(guidString, ObjectDisplay.NullLiteral)) End If End Sub From 8d309809a7a99111c79f91c64d0ec39ae85c789b Mon Sep 17 00:00:00 2001 From: Youssef1313 Date: Fri, 27 May 2022 11:15:01 +0200 Subject: [PATCH 3/7] More crash fixes --- .../Symbols/Attributes/AttributeData.vb | 11 +- .../Symbols/Source/SourceAssemblySymbol.vb | 12 +- .../Symbols/Source/SourceFieldSymbol.vb | 12 +- .../Symbols/Source/SourceModuleSymbol.vb | 12 +- .../Attributes/AttributeTests_StructLayout.vb | 31 +++ .../AttributeTests_WellKnownAttributes.vb | 237 +++++++++++++++++- 6 files changed, 308 insertions(+), 7 deletions(-) diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb b/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb index 4fdbb2599e62a..7a627bc8b84d1 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb @@ -252,6 +252,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Return Nothing End Function + Private Shared Function GetLocationForAttributeDiagnostic(nodeOpt As AttributeSyntax) As Location + ' 0 passed here isn't used since we care only about location. + Return GetArgumentAndLocation(nodeOpt, 0).Location + End Function + Private Shared Function GetArgumentAndLocation(nodeOpt As AttributeSyntax, value As Integer) As (Argument As String, Location As Location) If nodeOpt IsNot Nothing Then If nodeOpt.ArgumentList IsNot Nothing AndAlso nodeOpt.ArgumentList.Arguments.Count > 0 Then @@ -436,7 +441,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Case ClassInterfaceType.None, Cci.Constants.ClassInterfaceType_AutoDispatch, Cci.Constants.ClassInterfaceType_AutoDual Exit Select Case Else - Dim location = GetArgumentAndLocation(nodeOpt).Location + Dim location = GetLocationForAttributeDiagnostic(nodeOpt) diagnostics.Add(ERRID.ERR_BadAttribute1, location, Me.AttributeClass) End Select End Sub @@ -444,7 +449,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Friend Sub DecodeInterfaceTypeAttribute(node As AttributeSyntax, diagnostics As BindingDiagnosticBag) Dim discarded As ComInterfaceType = Nothing If Not DecodeInterfaceTypeAttribute(discarded) Then - Dim location = GetArgumentAndLocation(nodeOpt).Location + Dim location = GetLocationForAttributeDiagnostic(node) diagnostics.Add(ERRID.ERR_BadAttribute1, location, Me.AttributeClass) End If End Sub @@ -486,7 +491,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' Native compiler allows only a specific GUID format: "D" format (32 digits separated by hyphens) Dim guidVal As Guid If Not Guid.TryParseExact(guidString, "D", guidVal) Then - Dim location = GetArgumentAndLocation(nodeOpt).Location + Dim location = GetLocationForAttributeDiagnostic(nodeOpt) diagnostics.Add(ERRID.ERR_BadAttributeUuid2, location, Me.AttributeClass, If(guidString, ObjectDisplay.NullLiteral)) End If End Sub diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceAssemblySymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceAssemblySymbol.vb index a17ea95d20bda..c98c603691853 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceAssemblySymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceAssemblySymbol.vb @@ -1133,7 +1133,17 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols For i = 0 To argCount - 1 Dim arg As Integer = attrData.GetConstructorArgument(Of Integer)(i, SpecialType.System_Int32) If arg < 0 Then - diagnostics.Add(ERRID.ERR_BadAttribute1, If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(i).GetLocation(), NoLocation.Singleton), attrData.AttributeClass) + Dim location As Location + If nodeOpt IsNot Nothing Then + If nodeOpt.ArgumentList IsNot Nothing AndAlso nodeOpt.ArgumentList.Arguments.Count > i Then + location = nodeOpt.ArgumentList.Arguments(i).GetLocation() + Else + location = nodeOpt.GetLocation() + End If + Else + location = NoLocation.Singleton + End If + diagnostics.Add(ERRID.ERR_BadAttribute1, If(nodeOpt IsNot Nothing, location, NoLocation.Singleton), attrData.AttributeClass) End If Next End Sub diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFieldSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFieldSymbol.vb index 0d182e60056ce..86c60596a72b9 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFieldSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFieldSymbol.vb @@ -730,7 +730,17 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ElseIf attrData.IsTargetAttribute(Me, AttributeDescription.FieldOffsetAttribute) Then Dim offset = attrData.CommonConstructorArguments(0).DecodeValue(Of Integer)(SpecialType.System_Int32) If offset < 0 Then - diagnostics.Add(ERRID.ERR_BadAttribute1, arguments.AttributeSyntaxOpt.ArgumentList.Arguments(0).GetLocation(), attrData.AttributeClass) + Dim location As Location + If arguments.AttributeSyntaxOpt IsNot Nothing Then + If arguments.AttributeSyntaxOpt.ArgumentList IsNot Nothing AndAlso arguments.AttributeSyntaxOpt.ArgumentList.Arguments.Count > 0 Then + location = arguments.AttributeSyntaxOpt.ArgumentList.Arguments(0).GetLocation() + Else + location = arguments.AttributeSyntaxOpt.GetLocation() + End If + Else + location = NoLocation.Singleton + End If + diagnostics.Add(ERRID.ERR_BadAttribute1, location, attrData.AttributeClass) offset = 0 End If diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceModuleSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceModuleSymbol.vb index 7d175e19ed26b..99896b378fc5b 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceModuleSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceModuleSymbol.vb @@ -1096,7 +1096,17 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If attrData.IsTargetAttribute(Me, AttributeDescription.DefaultCharSetAttribute) Then Dim charSet As CharSet = attrData.GetConstructorArgument(Of CharSet)(0, SpecialType.System_Enum) If Not CommonModuleWellKnownAttributeData.IsValidCharSet(charSet) Then - DirectCast(arguments.Diagnostics, BindingDiagnosticBag).Add(ERRID.ERR_BadAttribute1, arguments.AttributeSyntaxOpt.ArgumentList.Arguments(0).GetLocation(), attrData.AttributeClass) + Dim location As Location + If arguments.AttributeSyntaxOpt IsNot Nothing Then + If arguments.AttributeSyntaxOpt.ArgumentList IsNot Nothing AndAlso arguments.AttributeSyntaxOpt.ArgumentList.Arguments.Count > 0 Then + location = arguments.AttributeSyntaxOpt.ArgumentList.Arguments(0).GetLocation() + Else + location = arguments.AttributeSyntaxOpt.GetLocation() + End If + Else + location = NoLocation.Singleton + End If + DirectCast(arguments.Diagnostics, BindingDiagnosticBag).Add(ERRID.ERR_BadAttribute1, location, attrData.AttributeClass) Else arguments.GetOrCreateData(Of CommonModuleWellKnownAttributeData)().DefaultCharacterSet = charSet End If diff --git a/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_StructLayout.vb b/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_StructLayout.vb index 01d8b03f30952..067fe39f1d95b 100644 --- a/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_StructLayout.vb +++ b/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_StructLayout.vb @@ -691,6 +691,37 @@ BC30127: Attribute 'FieldOffsetAttribute' is not valid: Incorrect argument value ]]>) End Sub + + Public Sub ExplicitFieldLayout_Errors2() + Dim source = + + + Dim b As Integer +End Class +]]> + + + + CreateCompilationWithMscorlib40(source).AssertTheseDiagnostics( + ~~~~~~~~~~~ +]]>) + End Sub + Public Sub ReadingFromMetadata() Using [module] = ModuleMetadata.CreateFromImage(TestResources.MetadataTests.Invalid.ClassLayout) diff --git a/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb b/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb index 83006c68d8f5a..3a34a823c4271 100644 --- a/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb +++ b/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb @@ -2306,7 +2306,6 @@ End Class End Sub) End Sub - Public Sub DllImport_DefaultCharSet_Errors() Dim source = @@ -2327,6 +2326,34 @@ BC30127: Attribute 'DefaultCharSetAttribute' is not valid: Incorrect argument va ]]>) End Sub + + Public Sub DllImport_DefaultCharSet_Errors2() + Dim source = + + + +Namespace System.Runtime.InteropServices + Public Class DefaultCharSetAttribute + Inherits Attribute + + Public Sub New(Optional charSet As CharSet = Integer.MaxValue) + End Sub + End Class +End Namespace +]]> + + + + CreateCompilationWithMscorlib40(source).AssertTheseDiagnostics( + ~~~~~~~~~~~~~~~~~~~~~ +]]>) + End Sub + Public Sub DefaultCharSet_Types() Dim source = @@ -4949,6 +4976,214 @@ BC30934: Conversion from 'String' to 'Integer' cannot occur in a constant expres ]]>) End Sub + + Public Sub TestTypeLibVersionAttribute_Invalid_03() + Dim source = + + ' Not valid. Both arguments are negative. + +Namespace System.Runtime.InteropServices + Public Class TypeLibVersionAttribute + Inherits Attribute + + Public Sub New(Optional major As Integer = -1, Optional minor As Integer = Integer.MinValue) + End Sub + End Class +End Namespace +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( ' Not valid. Both arguments are negative. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BC30127: Attribute 'TypeLibVersionAttribute' is not valid: Incorrect argument value. + ' Not valid. Both arguments are negative. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +]]>) + End Sub + + + Public Sub TestTypeLibVersionAttribute_Invalid_04() + Dim source = + + ' Not valid. minor is negative. + +Namespace System.Runtime.InteropServices + Public Class TypeLibVersionAttribute + Inherits Attribute + + Public Sub New(Optional major As Integer = -1, Optional minor As Integer = Integer.MinValue) + End Sub + End Class +End Namespace +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( ' Not valid. minor is negative. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +]]>) + End Sub + + + Public Sub TestTypeLibVersionAttribute_Invalid_05() + Dim source = + + ' Not valid. Both arguments are negative. + +Namespace System.Runtime.InteropServices + Public Class TypeLibVersionAttribute + Inherits Attribute + + Public Sub New(Optional major As Integer = -1, Optional minor As Integer = Integer.MinValue) + End Sub + End Class +End Namespace +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( ' Not valid. Both arguments are negative. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BC30127: Attribute 'TypeLibVersionAttribute' is not valid: Incorrect argument value. + ' Not valid. Both arguments are negative. + ~~ +]]>) + End Sub + + + Public Sub TestTypeLibVersionAttribute_Invalid_06() + Dim source = + + ' Not valid. Both arguments are negative. + +Namespace System.Runtime.InteropServices + Public Class TypeLibVersionAttribute + Inherits Attribute + + Public Sub New(Optional major As Integer = -1, Optional minor As Integer = Integer.MinValue) + End Sub + End Class +End Namespace +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( ' Not valid. Both arguments are negative. + ~~ +BC30127: Attribute 'TypeLibVersionAttribute' is not valid: Incorrect argument value. + ' Not valid. Both arguments are negative. + ~~ +]]>) + End Sub + + + Public Sub TestTypeLibVersionAttribute_Invalid_07() + Dim source = + + ' Not valid. major is negative. + +Namespace System.Runtime.InteropServices + Public Class TypeLibVersionAttribute + Inherits Attribute + + Public Sub New(Optional major As Integer = -1, Optional minor As Integer = Integer.MinValue) + End Sub + End Class +End Namespace +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( ' Not valid. major is negative. + ~~ +]]>) + End Sub + + + Public Sub TestTypeLibVersionAttribute_Invalid_08() + Dim source = + + ' Not valid. major is negative. + +Namespace System.Runtime.InteropServices + Public Class TypeLibVersionAttribute + Inherits Attribute + + Public Sub New(Optional major As Integer = -1, Optional minor As Integer = Integer.MinValue) + End Sub + End Class +End Namespace +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( ' Not valid. major is negative. + ~~ +]]>) + End Sub + + + Public Sub TestTypeLibVersionAttribute_Valid_UserDefinedAttribute() + Dim source = + + + +Namespace System.Runtime.InteropServices + Public Class TypeLibVersionAttribute + Inherits Attribute + + Public Sub New(Optional major As Integer = -1, Optional minor As Integer = Integer.MinValue) + End Sub + End Class +End Namespace +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics() + End Sub + #End Region #Region "ComCompatibleVersionAttribute" From 469bb322a70d72e50ad9172838a341cb3dc428bf Mon Sep 17 00:00:00 2001 From: Youssef1313 Date: Tue, 7 Jun 2022 07:57:07 +0200 Subject: [PATCH 4/7] Address review comments --- .../Symbols/Attributes/AttributeData.vb | 30 +++---- .../Symbols/Source/SourceAssemblySymbol.vb | 2 +- .../AttributeTests_WellKnownAttributes.vb | 80 +++++++++++++------ 3 files changed, 70 insertions(+), 42 deletions(-) diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb b/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb index 7a627bc8b84d1..2c3bec80fb187 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb @@ -252,15 +252,15 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Return Nothing End Function - Private Shared Function GetLocationForAttributeDiagnostic(nodeOpt As AttributeSyntax) As Location + Private Shared Function GetFirstArgumentLocation(nodeOpt As AttributeSyntax) As Location ' 0 passed here isn't used since we care only about location. - Return GetArgumentAndLocation(nodeOpt, 0).Location + Return GetFirstArgumentDisplayAndLocation(nodeOpt, 0).Location End Function - Private Shared Function GetArgumentAndLocation(nodeOpt As AttributeSyntax, value As Integer) As (Argument As String, Location As Location) + Private Shared Function GetFirstArgumentDisplayAndLocation(nodeOpt As AttributeSyntax, value As Integer) As (ArgumentDisplay As String, Location As Location) If nodeOpt IsNot Nothing Then If nodeOpt.ArgumentList IsNot Nothing AndAlso nodeOpt.ArgumentList.Arguments.Count > 0 Then - Dim arg = nodeOpt.ArgumentList.Arguments(0) + Dim arg As ArgumentSyntax = nodeOpt.ArgumentList.Arguments(0) Return (arg.ToString(), arg.GetLocation()) Else Return (value.ToString(), nodeOpt.GetLocation()) @@ -289,8 +289,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If Me.IsTargetAttribute(targetSymbol, AttributeDescription.PrincipalPermissionAttribute) Then ' BC31215: SecurityAction value '{0}' is invalid for PrincipalPermission attribute - Dim valueLocation = GetArgumentAndLocation(nodeOpt, securityAction) - diagnostics.Add(ERRID.ERR_PrincipalPermissionInvalidAction, valueLocation.Location, valueLocation.Argument) + Dim displayAndLocation As (ArgumentDisplay As String, Location As Location) = GetFirstArgumentDisplayAndLocation(nodeOpt, securityAction) + diagnostics.Add(ERRID.ERR_PrincipalPermissionInvalidAction, displayAndLocation.Location, displayAndLocation.ArgumentDisplay) hasErrors = True Return DeclarativeSecurityAction.None @@ -318,8 +318,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Case Else ' BC31214: SecurityAction value '{0}' is invalid for security attributes applied to a type or a method. - Dim valueLocation = GetArgumentAndLocation(nodeOpt, securityAction) - diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, valueLocation.Location, valueLocation.Argument) + Dim displayAndLocation As (ArgumentDisplay As String, Location As Location) = GetFirstArgumentDisplayAndLocation(nodeOpt, securityAction) + diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, displayAndLocation.Location, displayAndLocation.ArgumentDisplay) hasErrors = True Return DeclarativeSecurityAction.None @@ -330,8 +330,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' Types and methods cannot take permission requests. ' BC31214: SecurityAction value '{0}' is invalid for security attributes applied to a type or a method. - Dim valueLocation = GetArgumentAndLocation(nodeOpt, securityAction) - diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, valueLocation.Location, valueLocation.Argument) + Dim displayAndLocation As (ArgumentDisplay As String, Location As Location) = GetFirstArgumentDisplayAndLocation(nodeOpt, securityAction) + diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, displayAndLocation.Location, displayAndLocation.ArgumentDisplay) hasErrors = True Return DeclarativeSecurityAction.None @@ -341,8 +341,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' Assemblies cannot take declarative security. ' BC31213: SecurityAction value '{0}' is invalid for security attributes applied to an assembly. - Dim valueLocation = GetArgumentAndLocation(nodeOpt, securityAction) - diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionAssembly, valueLocation.Location, valueLocation.Argument) + Dim displayAndLocation As (ArgumentDisplay As String, Location As Location) = GetFirstArgumentDisplayAndLocation(nodeOpt, securityAction) + diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionAssembly, displayAndLocation.Location, displayAndLocation.ArgumentDisplay) hasErrors = True Return DeclarativeSecurityAction.None @@ -441,7 +441,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Case ClassInterfaceType.None, Cci.Constants.ClassInterfaceType_AutoDispatch, Cci.Constants.ClassInterfaceType_AutoDual Exit Select Case Else - Dim location = GetLocationForAttributeDiagnostic(nodeOpt) + Dim location As Location = GetFirstArgumentLocation(nodeOpt) diagnostics.Add(ERRID.ERR_BadAttribute1, location, Me.AttributeClass) End Select End Sub @@ -449,7 +449,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Friend Sub DecodeInterfaceTypeAttribute(node As AttributeSyntax, diagnostics As BindingDiagnosticBag) Dim discarded As ComInterfaceType = Nothing If Not DecodeInterfaceTypeAttribute(discarded) Then - Dim location = GetLocationForAttributeDiagnostic(node) + Dim location As Location = GetFirstArgumentLocation(node) diagnostics.Add(ERRID.ERR_BadAttribute1, location, Me.AttributeClass) End If End Sub @@ -491,7 +491,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' Native compiler allows only a specific GUID format: "D" format (32 digits separated by hyphens) Dim guidVal As Guid If Not Guid.TryParseExact(guidString, "D", guidVal) Then - Dim location = GetLocationForAttributeDiagnostic(nodeOpt) + Dim location As Location = GetFirstArgumentLocation(nodeOpt) diagnostics.Add(ERRID.ERR_BadAttributeUuid2, location, Me.AttributeClass, If(guidString, ObjectDisplay.NullLiteral)) End If End Sub diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceAssemblySymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceAssemblySymbol.vb index c98c603691853..1feda24c96a23 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceAssemblySymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceAssemblySymbol.vb @@ -1143,7 +1143,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Else location = NoLocation.Singleton End If - diagnostics.Add(ERRID.ERR_BadAttribute1, If(nodeOpt IsNot Nothing, location, NoLocation.Singleton), attrData.AttributeClass) + diagnostics.Add(ERRID.ERR_BadAttribute1, location, attrData.AttributeClass) End If Next End Sub diff --git a/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb b/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb index 3a34a823c4271..c403e72c9b9ce 100644 --- a/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb +++ b/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb @@ -3820,14 +3820,32 @@ end class Dim comp = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(source) - comp.VerifyDiagnostics(Diagnostic(ERRID.ERR_OmittedArgument2, "FileIOPermission").WithArguments("action", "Public Overloads Sub New(action As System.Security.Permissions.SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(0, SecurityAction)").WithArguments("DirectCast(0, SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(11, SecurityAction)").WithArguments("DirectCast(11, SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(-1, SecurityAction)").WithArguments("DirectCast(-1, SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(0, SecurityAction)").WithArguments("DirectCast(0, SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(11, SecurityAction)").WithArguments("DirectCast(11, SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(-1, SecurityAction)").WithArguments("DirectCast(-1, SecurityAction)"), - Diagnostic(ERRID.ERR_InvalidAttributeUsage2, "FileIOPermission").WithArguments("FileIOPermissionAttribute", "Field")) + comp.AssertTheseDiagnostics( + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BC31214: SecurityAction value 'DirectCast(11, SecurityAction)' is invalid for security attributes applied to a type or a method. + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BC31214: SecurityAction value 'DirectCast(-1, SecurityAction)' is invalid for security attributes applied to a type or a method. + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BC31214: SecurityAction value 'DirectCast(0, SecurityAction)' is invalid for security attributes applied to a type or a method. + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BC31214: SecurityAction value 'DirectCast(11, SecurityAction)' is invalid for security attributes applied to a type or a method. + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BC31214: SecurityAction value 'DirectCast(-1, SecurityAction)' is invalid for security attributes applied to a type or a method. + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BC30455: Argument not specified for parameter 'action' of 'Public Overloads Sub New(action As SecurityAction)'. + + ~~~~~~~~~~~~~~~~ +BC30662: Attribute 'FileIOPermissionAttribute' cannot be applied to 'Field' because the attribute is not valid on this declaration type. + + ~~~~~~~~~~~~~~~~ +]]>) End Sub @@ -3840,7 +3858,9 @@ Imports System.Security.Permissions Public Class MySecurityAttribute Inherits SecurityAttribute +#Disable Warning BC40000 ' RequestMinimum is obsolete Public Sub New(Optional action As SecurityAction = SecurityAction.RequestMinimum) +#Enable Warning BC40000 MyBase.New(action) End Sub @@ -3858,9 +3878,6 @@ End Class Dim comp = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(source) comp.AssertTheseDiagnostics( ~~~~~~~~~~~~~~~~~~~ @@ -3940,14 +3957,26 @@ end class Dim comp = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(source) - comp.VerifyDiagnostics( - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute"), - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute"), - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute"), - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute"), - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute"), - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute") - ) + comp.AssertTheseDiagnostics( + ~~~~~~~~~~~~~~~~~~~ +BC31211: First argument to a security attribute must be a valid SecurityAction. + + ~~~~~~~~~~~~~~~~~~~ +BC31211: First argument to a security attribute must be a valid SecurityAction. + + ~~~~~~~~~~~~~~~~~~~ +BC31211: First argument to a security attribute must be a valid SecurityAction. + + ~~~~~~~~~~~~~~~~~~~ +BC31211: First argument to a security attribute must be a valid SecurityAction. + + ~~~~~~~~~~~~~~~~~~~ +BC31211: First argument to a security attribute must be a valid SecurityAction. + + ~~~~~~~~~~~~~~~~~~~ +]]>) End Sub @@ -4216,8 +4245,14 @@ Imports System.Security.Permissions Namespace System.Security.Permissions Public Class PrincipalPermissionAttribute Inherits SecurityAttribute + Public Sub New(Optional action As SecurityAction = SecurityAction.InheritanceDemand) + MyBase.New(action) End Sub + + Public Overrides Function CreatePermission() As IPermission + Throw New NotImplementedException() + End Function End Class End Namespace @@ -4232,13 +4267,6 @@ End Class Dim comp = CreateCompilationWithMscorlib40(source) comp.AssertTheseDiagnostics( ~~~~~~~~~~~~~~~~~~~ From 555b2ce7f81605db7625eae986a30ced8c289778 Mon Sep 17 00:00:00 2001 From: Youssef Victor Date: Tue, 7 Jun 2022 10:26:56 +0200 Subject: [PATCH 5/7] Update AttributeTests_StructLayout.vb --- .../Test/Emit/Attributes/AttributeTests_StructLayout.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_StructLayout.vb b/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_StructLayout.vb index 067fe39f1d95b..9ea8a80736567 100644 --- a/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_StructLayout.vb +++ b/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_StructLayout.vb @@ -717,8 +717,8 @@ End Class CreateCompilationWithMscorlib40(source).AssertTheseDiagnostics( - ~~~~~~~~~~~ + + ~~~~~~~~~~~ ]]>) End Sub From f702ee7e3a731c88b6d4ca6d5841c09a58c8a079 Mon Sep 17 00:00:00 2001 From: Youssef1313 Date: Sun, 12 Jun 2022 16:46:04 +0200 Subject: [PATCH 6/7] Refactor --- .../Symbols/Attributes/AttributeData.vb | 19 +++++++++++++------ .../Symbols/Source/SourceAssemblySymbol.vb | 12 +----------- .../Symbols/Source/SourceFieldSymbol.vb | 12 +----------- .../Symbols/Source/SourceMethodSymbol.vb | 12 +----------- .../Symbols/Source/SourceModuleSymbol.vb | 12 +----------- 5 files changed, 17 insertions(+), 50 deletions(-) diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb b/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb index 2c3bec80fb187..f1547defa222a 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb @@ -252,15 +252,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Return Nothing End Function - Private Shared Function GetFirstArgumentLocation(nodeOpt As AttributeSyntax) As Location - ' 0 passed here isn't used since we care only about location. - Return GetFirstArgumentDisplayAndLocation(nodeOpt, 0).Location + Friend Shared Function GetArgumentLocation(nodeOpt As AttributeSyntax, argumentIndex As Integer) As Location + Return GetArgumentDisplayAndLocation(nodeOpt, 0, argumentIndex).Location End Function - Private Shared Function GetFirstArgumentDisplayAndLocation(nodeOpt As AttributeSyntax, value As Integer) As (ArgumentDisplay As String, Location As Location) + Private Shared Function GetArgumentDisplayAndLocation(nodeOpt As AttributeSyntax, value As Integer, argumentIndex As Integer) As (ArgumentDisplay As String, Location As Location) If nodeOpt IsNot Nothing Then - If nodeOpt.ArgumentList IsNot Nothing AndAlso nodeOpt.ArgumentList.Arguments.Count > 0 Then - Dim arg As ArgumentSyntax = nodeOpt.ArgumentList.Arguments(0) + If nodeOpt.ArgumentList IsNot Nothing AndAlso nodeOpt.ArgumentList.Arguments.Count > argumentIndex Then + Dim arg As ArgumentSyntax = nodeOpt.ArgumentList.Arguments(argumentIndex) Return (arg.ToString(), arg.GetLocation()) Else Return (value.ToString(), nodeOpt.GetLocation()) @@ -270,6 +269,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols End If End Function + Friend Shared Function GetFirstArgumentLocation(nodeOpt As AttributeSyntax) As Location + Return GetArgumentLocation(nodeOpt, argumentIndex:=0) + End Function + + Private Shared Function GetFirstArgumentDisplayAndLocation(nodeOpt As AttributeSyntax, value As Integer) As (ArgumentDisplay As String, Location As Location) + Return GetArgumentDisplayAndLocation(nodeOpt, value, argumentIndex:=0) + End Function + Private Function ValidateSecurityAction( typedValue As TypedConstant, targetSymbol As Symbol, diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceAssemblySymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceAssemblySymbol.vb index 1feda24c96a23..13733e7c3a794 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceAssemblySymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceAssemblySymbol.vb @@ -1133,17 +1133,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols For i = 0 To argCount - 1 Dim arg As Integer = attrData.GetConstructorArgument(Of Integer)(i, SpecialType.System_Int32) If arg < 0 Then - Dim location As Location - If nodeOpt IsNot Nothing Then - If nodeOpt.ArgumentList IsNot Nothing AndAlso nodeOpt.ArgumentList.Arguments.Count > i Then - location = nodeOpt.ArgumentList.Arguments(i).GetLocation() - Else - location = nodeOpt.GetLocation() - End If - Else - location = NoLocation.Singleton - End If - diagnostics.Add(ERRID.ERR_BadAttribute1, location, attrData.AttributeClass) + diagnostics.Add(ERRID.ERR_BadAttribute1, VisualBasicAttributeData.GetArgumentLocation(nodeOpt, i), attrData.AttributeClass) End If Next End Sub diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFieldSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFieldSymbol.vb index 86c60596a72b9..e6827cfdcef82 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFieldSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFieldSymbol.vb @@ -730,17 +730,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ElseIf attrData.IsTargetAttribute(Me, AttributeDescription.FieldOffsetAttribute) Then Dim offset = attrData.CommonConstructorArguments(0).DecodeValue(Of Integer)(SpecialType.System_Int32) If offset < 0 Then - Dim location As Location - If arguments.AttributeSyntaxOpt IsNot Nothing Then - If arguments.AttributeSyntaxOpt.ArgumentList IsNot Nothing AndAlso arguments.AttributeSyntaxOpt.ArgumentList.Arguments.Count > 0 Then - location = arguments.AttributeSyntaxOpt.ArgumentList.Arguments(0).GetLocation() - Else - location = arguments.AttributeSyntaxOpt.GetLocation() - End If - Else - location = NoLocation.Singleton - End If - diagnostics.Add(ERRID.ERR_BadAttribute1, location, attrData.AttributeClass) + diagnostics.Add(ERRID.ERR_BadAttribute1, VisualBasicAttributeData.GetFirstArgumentLocation(arguments.AttributeSyntaxOpt), attrData.AttributeClass) offset = 0 End If diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb index 7ed7b774be58b..63f4f03001473 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb @@ -1651,17 +1651,7 @@ lReportErrorOnTwoTokens: Dim moduleName As String = TryCast(attrData.CommonConstructorArguments(0).ValueInternal, String) If Not MetadataHelpers.IsValidMetadataIdentifier(moduleName) Then - Dim location As Location - If arguments.AttributeSyntaxOpt IsNot Nothing Then - If arguments.AttributeSyntaxOpt.ArgumentList IsNot Nothing AndAlso arguments.AttributeSyntaxOpt.ArgumentList.Arguments.Count > 0 Then - location = arguments.AttributeSyntaxOpt.ArgumentList.Arguments(0).GetLocation() - Else - location = arguments.AttributeSyntaxOpt.GetLocation() - End If - Else - location = NoLocation.Singleton - End If - diagnostics.Add(ERRID.ERR_BadAttribute1, location, attrData.AttributeClass) + diagnostics.Add(ERRID.ERR_BadAttribute1, VisualBasicAttributeData.GetFirstArgumentLocation(arguments.AttributeSyntaxOpt), attrData.AttributeClass) End If ' Default value of charset is inherited from the module (only if specified). diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceModuleSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceModuleSymbol.vb index 99896b378fc5b..adc6afbada207 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceModuleSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceModuleSymbol.vb @@ -1096,17 +1096,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If attrData.IsTargetAttribute(Me, AttributeDescription.DefaultCharSetAttribute) Then Dim charSet As CharSet = attrData.GetConstructorArgument(Of CharSet)(0, SpecialType.System_Enum) If Not CommonModuleWellKnownAttributeData.IsValidCharSet(charSet) Then - Dim location As Location - If arguments.AttributeSyntaxOpt IsNot Nothing Then - If arguments.AttributeSyntaxOpt.ArgumentList IsNot Nothing AndAlso arguments.AttributeSyntaxOpt.ArgumentList.Arguments.Count > 0 Then - location = arguments.AttributeSyntaxOpt.ArgumentList.Arguments(0).GetLocation() - Else - location = arguments.AttributeSyntaxOpt.GetLocation() - End If - Else - location = NoLocation.Singleton - End If - DirectCast(arguments.Diagnostics, BindingDiagnosticBag).Add(ERRID.ERR_BadAttribute1, location, attrData.AttributeClass) + DirectCast(arguments.Diagnostics, BindingDiagnosticBag).Add(ERRID.ERR_BadAttribute1, VisualBasicAttributeData.GetFirstArgumentLocation(arguments.AttributeSyntaxOpt), attrData.AttributeClass) Else arguments.GetOrCreateData(Of CommonModuleWellKnownAttributeData)().DefaultCharacterSet = charSet End If From 61a1e1f1d42186e21c0bb1783d5a042913b4d4ea Mon Sep 17 00:00:00 2001 From: Youssef1313 Date: Sun, 12 Jun 2022 16:46:35 +0200 Subject: [PATCH 7/7] Fix typo --- .../Emit/Attributes/AttributeTests_WellKnownAttributes.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb b/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb index c403e72c9b9ce..0c138059aa558 100644 --- a/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb +++ b/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb @@ -5165,7 +5165,7 @@ BC30127: Attribute 'TypeLibVersionAttribute' is not valid: Incorrect argument va ' Not valid. major is negative. + ' Not valid. minor is negative. Namespace System.Runtime.InteropServices Public Class TypeLibVersionAttribute @@ -5182,7 +5182,7 @@ End Namespace Dim comp = CreateCompilationWithMscorlib40(source) comp.AssertTheseDiagnostics( ' Not valid. major is negative. + ' Not valid. minor is negative. ~~ ]]>) End Sub