rspec/rules/S3900/vbnet/rule.adoc
Fred Tingaud 16f6c0aecf
Inline adoc when include has no additional value (#1940)
Inline adoc files when they are included exactly once.

Also fix language tags because this inlining gives us better information
on what language the code is written in.
2023-05-25 14:18:12 +02:00

88 lines
2.6 KiB
Plaintext

== Why is this an issue?
Methods declared as `Public`, `Protected`, or `Protected Friend` can be accessed from other assemblies, which means you should validate parameters to be within the expected constraints. In general, checking against `Nothing` is recommended in defensive programming.
This rule raises an issue when a parameter of a publicly accessible method is not validated against `Nothing` before being dereferenced.
=== Noncompliant code example
[source,vbnet]
----
Public Class Sample
Public Property Message As String
Public Sub PublicMethod(Arg As Exception)
Message = Arg.Message ' Noncompliant
End Sub
Protected Sub ProtectedMethod(Arg As Exception)
Message = Arg.Message ' Noncompliant
End Sub
End Class
----
=== Compliant solution
[source,vbnet]
----
Public Class Sample
Public Property Message As String
Public Sub PublicMethod(Arg As Exception)
If Arg IsNot Nothing Then Message = Arg.Message ' Noncompliant
End Sub
Protected Sub ProtectedMethod(Arg As Exception)
ArgumentNullException.ThrowIfNull(Arg)
Message = Arg.Message ' Noncompliant
End Sub
Private Sub PrivateMethod(Arg As Exception)
Message = Arg.Message ' Compliant: method is not publicly accessible
End Sub
End Class
----
=== Exceptions
* Arguments validated for `Nothing` via helper methods should be annotated with the https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/attributes/nullable-analysis#postconditions-maybenull-and-notnull[`[NotNull]`] attribute.
* Method parameters marked with the `[NotNull]` https://www.jetbrains.com/help/resharper/Reference__Code_Annotation_Attributes.html#ItemNotNullAttribute[Resharper code annotation attribute] are supported as well.
* To create a custom null validation method declare an attribute with name `ValidatedNotNullAttribute` and mark the parameter that is validated for null in your method declaration with it:
[source,vbnet]
----
Imports System.Runtime.CompilerServices
<AttributeUsage(AttributeTargets.Parameter, Inherited:=False)>
Public NotInheritable Class ValidatedNotNullAttribute
Inherits Attribute
End Class
Public Module Guard
Public Sub NotNull(Of T As Class)(<ValidatedNotNullAttribute> Value As T, <CallerArgumentExpression("Value")> Optional Name As String = "")
If Value Is Nothing Then Throw New ArgumentNullException(Name)
End Sub
End Module
Public Module SampleUsage
Public Function CustomToUpper(Value As String) As String
Guard.NotNull(Value)
Return Value.ToUpper
End Function
End Module
----
include::../rspecator.adoc[]