Skip to content

PSUseDeclaredVarsMoreThanAssignment not correctly handling array adds #699

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Closed
HowardWolosky opened this issue Jan 31, 2017 · 3 comments · Fixed by #935
Closed

PSUseDeclaredVarsMoreThanAssignment not correctly handling array adds #699

HowardWolosky opened this issue Jan 31, 2017 · 3 comments · Fixed by #935

Comments

@HowardWolosky
Copy link

HowardWolosky commented Jan 31, 2017

Given the following code

$msg = @()
@("a", "b") | ForEach-Object { $msg += $_ }
Write-Information $msg -InformationAction Continue

I get the following warning:

  • The variable 'msg' is assigned but never used. (line 2)

I realize that this generates a new array each time, but it is both being assigned to and read, so this appears to be a false positive.

Another similar scenario:

$params = (@{"a" = 1; "b" = 2}).GetEnumerator() |
    ForEach-Object { $m = @{} } { $m[$_.Name] = $_.Value } { $m } # foreach begin{} process{} end{}
$params
  • The variable 'm' is assigned but never used. (line 2)
HowardWolosky pushed a commit to microsoft/StoreBroker that referenced this issue Feb 8, 2017
There are some new warnings coming up when checking StoreBroker
with newer versions of [PSScriptAnalyzer](https://github.com/PowerShell/PSScriptAnalyzer).

* `PSUseDeclaredVarsMoreThanAssignments` - We had some instances where
  a variable was being assigned to but never used.  For the API instances,
  we now capture to $null in the instances where we don't want the helper
  method's results being returned to the user.

* `PSUseShouldProcessForStateChangingFunctions` - Two PackageTool methods
  use the verb "Remove" but have no need for providing ShouldProcess support.
  Those instances are now suppressed.

All remaining warnings are false positives of `PSUseDeclaredVarsMoreThanAssignments`.
I have opened two different issues against PSScriptAnalyzer to track these false
positives:
   * [PSUseDeclaredVarsMoreThanAssignment not correctly handling global vars assigned to within functions](PowerShell/PSScriptAnalyzer#698)
   * [PSUseDeclaredVarsMoreThanAssignment not correctly handling array adds](PowerShell/PSScriptAnalyzer#699)

Updated CONTRIBUTING.md to remind users to keep the analyzer module up-to-date.

Additionally, the links in PDP.md were invalid.  Those have now been fixed.
HowardWolosky added a commit to microsoft/StoreBroker that referenced this issue Feb 10, 2017
There are some new warnings coming up when checking StoreBroker
with newer versions of [PSScriptAnalyzer](https://github.com/PowerShell/PSScriptAnalyzer).

* `PSUseDeclaredVarsMoreThanAssignments` - We had some instances where
  a variable was being assigned to but never used.  For the API instances,
  we now capture to $null in the instances where we don't want the helper
  method's results being returned to the user.

* `PSUseShouldProcessForStateChangingFunctions` - Two PackageTool methods
  use the verb "Remove" but have no need for providing ShouldProcess support.
  Those instances are now suppressed.

All remaining warnings are false positives of `PSUseDeclaredVarsMoreThanAssignments`.
I have opened two different issues against PSScriptAnalyzer to track these false
positives:
   * [PSUseDeclaredVarsMoreThanAssignment not correctly handling global vars assigned to within functions](PowerShell/PSScriptAnalyzer#698)
   * [PSUseDeclaredVarsMoreThanAssignment not correctly handling array adds](PowerShell/PSScriptAnalyzer#699)

Updated CONTRIBUTING.md to remind users to keep the analyzer module up-to-date.

Additionally, the links in PDP.md were invalid.  Those have now been fixed.
@DexterPOSH
Copy link

bump

Is this fixed already? I still see these false positives.

PS>gmo PSScriptAnalyzer

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     1.15.0     PSScriptAnalyzer                    {Get-ScriptAnalyzerRule, Invoke-Formatter, Invoke-ScriptAn...


PS>Invoke-ScriptAnalyzer  -ScriptDefinition {  $jobs=@()
>>                     $ipList | ForEach-Object {
>>                         $running = @(Get-Job | Where-Object { $_.State -eq 'Running' })
>>                         if ($running.Count -ge 10)
>>                         {
>>                             $running | Wait-Job -Any | Out-Null
>>                         }
>>                         Write-Verbose "Discovering ip $_"
>>                         $jobs += Start-Job -ScriptBlock $cmd -ArgumentList $_, $credential, $deepDiscover
>>                     }
>>                     Wait-Job -Job $jobs | Out-Null
>>                     Receive-Job -Job $jobs
>>                 }.ToString()

RuleName                            Severity     ScriptName Line  Message
--------                            --------     ---------- ----  -------
PSUseDeclaredVarsMoreThanAssignment Warning                 9     The variable 'jobs' is assigned but never used.
s

@Jaykul
Copy link
Contributor

Jaykul commented Dec 22, 2017

It's not the array, it's the ForEach loop

It also happens if you define a variable in the begin block of the ForEach, like this:

$Doubles = 1..100 | ForEach { $collect = @() } { $Collect += $_ * 2 } { $Collect }

Or when you use a hashtable like:

$Requirement = Get-Item .
[hashtable]$hash = $Requirement.PSObject.Properties.Where{$_.Value} | ForEach-Object { $ht = @{} } { $ht.Add($_.Name, $_.value) } { $ht }
$hash

@bergmeister
Copy link
Collaborator

bergmeister commented Mar 14, 2018

@Jaykul Actually, it is a problem of both the += operator being treated as assignment (not usage) , I will therefore extract your examples (that I think are valid) because I found a solution to the originally raised issue that is due to +=

# for free to join this conversation on GitHub. Already have an account? # to comment
Projects
None yet
6 participants