
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.
88 lines
2.6 KiB
Plaintext
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[]
|