Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -243,16 +243,40 @@ 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

Return Nothing
End Function

Friend Shared Function GetArgumentLocation(nodeOpt As AttributeSyntax, argumentIndex As Integer) As Location
Return GetArgumentDisplayAndLocation(nodeOpt, 0, argumentIndex).Location
End Function

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 > argumentIndex Then
Dim arg As ArgumentSyntax = nodeOpt.ArgumentList.Arguments(argumentIndex)
Return (arg.ToString(), arg.GetLocation())
Else
Return (value.ToString(), nodeOpt.GetLocation())
End If
Else
Return ("", NoLocation.Singleton)
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,
Expand All @@ -271,10 +295,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 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
Expand All @@ -301,11 +324,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 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
Expand All @@ -315,10 +336,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 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
Expand All @@ -327,10 +347,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 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
Expand Down Expand Up @@ -376,7 +395,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)
Comment on lines 399 to 401
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wasn't able to write a test that makes a crash here, so I didn't make a change.
In case someone was able to, let me know.

Expand Down Expand Up @@ -429,14 +448,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, nodeOpt.ArgumentList.Arguments(0).GetLocation(), NoLocation.Singleton), Me.AttributeClass)
Dim location As Location = GetFirstArgumentLocation(nodeOpt)
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, node.ArgumentList.Arguments(0).GetLocation(), Me.AttributeClass)
Dim location As Location = GetFirstArgumentLocation(node)
diagnostics.Add(ERRID.ERR_BadAttribute1, location, Me.AttributeClass)
End If
End Sub

Expand Down Expand Up @@ -477,9 +498,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, nodeOpt.ArgumentList.Arguments(0).GetLocation(), NoLocation.Singleton),
Me.AttributeClass, If(guidString, ObjectDisplay.NullLiteral))
Dim location As Location = GetFirstArgumentLocation(nodeOpt)
diagnostics.Add(ERRID.ERR_BadAttributeUuid2, location, Me.AttributeClass, If(guidString, ObjectDisplay.NullLiteral))
End If
End Sub

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1133,7 +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
diagnostics.Add(ERRID.ERR_BadAttribute1, If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(i).GetLocation(), NoLocation.Singleton), attrData.AttributeClass)
diagnostics.Add(ERRID.ERR_BadAttribute1, VisualBasicAttributeData.GetArgumentLocation(nodeOpt, i), attrData.AttributeClass)
End If
Next
End Sub
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -730,7 +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
diagnostics.Add(ERRID.ERR_BadAttribute1, arguments.AttributeSyntaxOpt.ArgumentList.Arguments(0).GetLocation(), attrData.AttributeClass)
diagnostics.Add(ERRID.ERR_BadAttribute1, VisualBasicAttributeData.GetFirstArgumentLocation(arguments.AttributeSyntaxOpt), attrData.AttributeClass)
offset = 0
End If

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1651,7 +1651,7 @@ 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)
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).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1096,7 +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
DirectCast(arguments.Diagnostics, BindingDiagnosticBag).Add(ERRID.ERR_BadAttribute1, arguments.AttributeSyntaxOpt.ArgumentList.Arguments(0).GetLocation(), 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -691,6 +691,37 @@ BC30127: Attribute 'FieldOffsetAttribute' is not valid: Incorrect argument value
]]>)
End Sub

<Fact>
Public Sub ExplicitFieldLayout_Errors2()
Dim source =
<compilation>
<file><![CDATA[
Imports System.Runtime.InteropServices

Namespace System.Runtime.InteropServices
Public Class FieldOffsetAttribute
Inherits Attribute

Public Sub New(Optional offset As Integer = -1)
End Sub
End Class
End Namespace

Public Class S
<FieldOffset>
Dim b As Integer
End Class
]]>
</file>
</compilation>

CreateCompilationWithMscorlib40(source).AssertTheseDiagnostics(<![CDATA[
BC30127: Attribute 'FieldOffsetAttribute' is not valid: Incorrect argument value.
<FieldOffset>
~~~~~~~~~~~
]]>)
End Sub

<Fact>
Public Sub ReadingFromMetadata()
Using [module] = ModuleMetadata.CreateFromImage(TestResources.MetadataTests.Invalid.ClassLayout)
Expand Down
Loading