PSScriptAnalyzer icon indicating copy to clipboard operation
PSScriptAnalyzer copied to clipboard

$FormatEnumerationLimit triggers PSAvoidGlobalVars warning

Open ssudnits opened this issue 3 years ago • 1 comments

Steps to reproduce

Run PSSA against the following code:

function Test-FormatLimitGlobal
{
  # Change format enum limit Globally
  $Old = $Global:FormatEnumerationLimit
  $Global:FormatEnumerationLimit = 1
  "After changing: [$Global:FormatEnumerationLimit]"
  Get-Process | Select-Object -Property Name, Threads -First 4
  # Change it back
  $Global:FormatEnumerationLimit = $Old
}

Expected behavior

PSSA does not trigger any warning against FormatEnumerationLimit

Actual behavior

"Found global variable 'Global:FormatEnumerationLimit'." warning issued for every use of FormatEnumerationLimit

Environment data

> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.18362.1801
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.18362.1801
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

> (Get-Module -ListAvailable PSScriptAnalyzer).Version | ForEach-Object { $_.ToString() }
1.20.0

Shouldn't FormatEnumerationLimit be in SpecialVars.cs with the rest of built-ins?

ssudnits avatar Dec 20 '21 16:12 ssudnits

Thanks for bringing this to our attention @ssudnits! We were able to reproduce this issue but are unsure when we will get around to fixing it. Will mark up for grabs.

StevenBucher98 avatar Jan 05 '22 20:01 StevenBucher98

@ssudnits Please can you clarify why you need to use the global scope in this case here because that's kind of what the rule is about. I see that Invoke-ScriptAnalyzer -ScriptDefinition '$FormatEnumerationLimit = 2' triggers a PSUseDeclaredVarsMoreThanAssignments violation but Invoke-ScriptAnalyzer -ScriptDefinition '$ErrorActionPreference = 2' doesn't so FormatEnumerationLimit could be added to a special exclusion list for PSUseDeclaredVarsMoreThanAssignments.

bergmeister avatar Aug 30 '22 22:08 bergmeister

@bergmeister Because $FormatEnumerationLimit is a global and I want code to reflect that? Also, why does Invoke-ScriptAnalyzer -ScriptDefinition '$global:ErrorActionPreference = 2' not trigger any warning?

ssudnits avatar Aug 31 '22 10:08 ssudnits

Ok, I think you are right that we should add it to the list of automatic variables here: https://github.com/PowerShell/PSScriptAnalyzer/blob/master/Engine/SpecialVars.cs

bergmeister avatar Aug 31 '22 13:08 bergmeister