From 826213ed01f73625a39020cb512490744ba6c09f Mon Sep 17 00:00:00 2001 From: Sebastien Marichal Date: Wed, 18 Dec 2024 15:06:04 +0100 Subject: [PATCH 1/3] Modify rule S907: vb6 LaYC (#4581) --- rules/S907/vb6/rule.adoc | 71 +++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 30 deletions(-) diff --git a/rules/S907/vb6/rule.adoc b/rules/S907/vb6/rule.adoc index 1395593eda8..7bbd1d1d209 100644 --- a/rules/S907/vb6/rule.adoc +++ b/rules/S907/vb6/rule.adoc @@ -1,48 +1,59 @@ == Why is this an issue? -``++GoTo++`` is an unstructured control flow statement. It makes code less readable and maintainable. Structured control flow statements such as ``++If++``, ``++For++``, ``++While++``, or ``++Exit++`` should be used instead. +`GoTo` is an unstructured control flow statement. It makes code less readable and maintainable. Structured control flow statements such as `If`, `For`, `While`, or `Exit` should be used instead. -=== Noncompliant code example +=== Exceptions + +`On Error GoTo` statements are ignored as correct error handling. + +== How to fix it + +Replace `GoTo` statements with structured control flow statements. + +=== Code examples + +==== Noncompliant code example -[source,vb6] +[source,vb6,diff-id=1,diff-type=noncompliant] ---- - Sub gotoStatementDemo() - Dim number As Integer = 1 - Dim sampleString As String - ' Evaluate number and branch to appropriate label. - If number = 1 Then GoTo Line1 Else GoTo Line2 +Sub gotoStatementDemo() + Dim number As Integer = 1 + Dim sampleString As String + ' Evaluate number and branch to appropriate label. + If number = 1 Then GoTo Line1 Else GoTo Line2 Line1: - sampleString = "Number equals 1" - GoTo LastLine + sampleString = "Number equals 1" + GoTo LastLine Line2: - ' The following statement never gets executed because number = 1. - sampleString = "Number equals 2" + ' The following statement never gets executed because number = 1. + sampleString = "Number equals 2" LastLine: - ' Write "Number equals 1" in the Debug window. - Debug.WriteLine(sampleString) - End Sub + ' Write "Number equals 1" in the Debug window. + Debug.WriteLine(sampleString) +End Sub ---- -=== Compliant solution +==== Compliant solution -[source,vb6] +[source,vb6,diff-id=1,diff-type=compliant] ---- - Sub gotoStatementDemo() - Dim number As Integer = 1 - Dim sampleString As String - ' Evaluate number and branch to appropriate label. - If number = 1 Then - sampleString = "Number equals 1" - Else - sampleString = "Number equals 2" - End If - Debug.WriteLine(sampleString) - End Sub +Sub gotoStatementDemo() + Dim number As Integer = 1 + Dim sampleString As String + ' Evaluate number and branch to appropriate label. + If number = 1 Then + sampleString = "Number equals 1" + Else + sampleString = "Number equals 2" + End If + Debug.WriteLine(sampleString) +End Sub ---- -=== Exceptions +== Resources +=== Documentation -``++On Error GoTo++`` statements are ignored as correct error handling. +* Microsoft Learn - https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/goto-statement[GoTo statement] ifdef::env-github,rspecator-view[] From 1d97909d90a92d6390df3c2411254a5e6f93ed6c Mon Sep 17 00:00:00 2001 From: Tobias Hahnen Date: Wed, 18 Dec 2024 16:26:24 +0100 Subject: [PATCH 2/3] Update description (#4583) --- rules/S1542/vb6/rule.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/S1542/vb6/rule.adoc b/rules/S1542/vb6/rule.adoc index 49a3c46ddbf..113584b3aed 100644 --- a/rules/S1542/vb6/rule.adoc +++ b/rules/S1542/vb6/rule.adoc @@ -4,7 +4,7 @@ include::../description.adoc[] === Noncompliant code example -With default provided regular expression: ^[A-Z][a-zA-Z0-9_]*$ +With default provided regular expression: ^([A-Z][a-zA-Z0-9_]*)|([a-z][a-zA-Z0-9]*_[A-Z][a-zA-Z]*)$ [source,vb6] From 38ffd02fc370dbc1030d06495f8fdbfe3be27a94 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Dec 2024 16:32:34 +0100 Subject: [PATCH 3/3] Create rule S6146: "Option Explicit" should be enabled (#4582) * Add vb6 to rule S6146 * Add description * Update description for LaYC --------- Co-authored-by: thahnen Co-authored-by: Tobi Hahnen --- rules/S6146/vb6/metadata.json | 2 ++ rules/S6146/vb6/rule.adoc | 36 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 rules/S6146/vb6/metadata.json create mode 100644 rules/S6146/vb6/rule.adoc diff --git a/rules/S6146/vb6/metadata.json b/rules/S6146/vb6/metadata.json new file mode 100644 index 00000000000..7a73a41bfdf --- /dev/null +++ b/rules/S6146/vb6/metadata.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/rules/S6146/vb6/rule.adoc b/rules/S6146/vb6/rule.adoc new file mode 100644 index 00000000000..a3828481b42 --- /dev/null +++ b/rules/S6146/vb6/rule.adoc @@ -0,0 +1,36 @@ +== Why is this an issue? + +There are several compilations options available for Visual Basic source code and `Option Explicit` defines compiler behavior for implicit variable declarations. Not specifying `Option Explicit` will allow creating a variable by it's first usage. This behavior can lead to unexpected runtime errors due to typos in variable names. + +== How to fix it + +`Option Explicit` should be added to every individual source file. + +=== Code examples + +==== Noncompliant code example + +[source,vb6,diff-id=1,diff-type=noncompliant] +---- +Sub DoSomething(First As String, Second As String) + Parameter = Fist ' New local variable "Fist" is created and assigned to new local variable "Parameter" instead of "First" argument. + DoSomething(Parameter) + Parametr = Second ' "Second" argument is assigned to newly created variable "Parametr" instead of intended "Parameter". + DoSomething(Parameter) ' Value of "Parameter" is always Nothing +End Sub +---- + + +==== Compliant solution + +[source,vb6,diff-id=1,diff-type=compliant] +---- +Option Explicit + +Sub DoSomething(First As String, Second As String) + Dim Parameter As String = First + DoSomething(Parameter) + Parameter = Second + DoSomething(Parameter) +End Sub +----