PSScriptAnalyzer icon indicating copy to clipboard operation
PSScriptAnalyzer copied to clipboard

PSAvoidAssignmentToAutomaticVariable Errors on validateset

Open nascentt opened this issue 1 year ago • 4 comments

I have been getting errors on validateset because PSScriptAnalyzer is confusing the validateset as assignment.

An example of this happening is

[validateset($True, $False)]
[bool]$UnfurlLinks,

[validateset($True, $False)]
[bool]$UnfurlMedia,

from https://github.com/RamblingCookieMonster/PSSlack/blob/master/PSSlack/Public/New-SlackMessage.ps1

nascentt avatar Feb 28 '24 09:02 nascentt

This is a strange one.

Ultimately ValidateSet only accepts a string array of valid values, so I guess it's going to cast $True and $False to string and be left with 'True' and 'False'.

That's why, in the terminal, when I use the parameter completion that ValidateSet facilitates, I get the string options (not $true or $false):

image

But accepting the suggestions, the function errors:

New-SlackMessage: Cannot process argument transformation on parameter 'UnfurlLinks'. Cannot convert value "System.String" to type "System.Boolean". Boolean parameters accept only Boolean values and numbers, such as $True, $False, 1 or 0.

Which makes me think the function needs some work if it's using ValidateSet to ensure that a declared Boolean value is either true or false 🤔.

That all said, you're correct and it's not assignment. The rule is probably checking all parameters for any variable expressions and alerting if a reserved name is used.

I'll take a look at this.

liamjpeters avatar Mar 27 '24 14:03 liamjpeters

This is a strange one.

Ultimately ValidateSet only accepts a string array of valid values, so I guess it's going to cast $True and $False to string and be left with 'True' and 'False'.

That's why, in the terminal, when I use the parameter completion that ValidateSet facilitates, I get the string options (not $true or $false):

image

But accepting the suggestions, the function errors:

New-SlackMessage: Cannot process argument transformation on parameter 'UnfurlLinks'. Cannot convert value "System.String" to type "System.Boolean". Boolean parameters accept only Boolean values and numbers, such as $True, $False, 1 or 0.

Which makes me think the function needs some work if it's using ValidateSet to ensure that a declared Boolean value is either true or false 🤔.

That all said, you're correct and it's not assignment. The rule is probably checking all parameters for any variable expressions and alerting if a reserved name is used.

I'll take a look at this.

it's not that $true and $false are being converted to a string. It's that they are constants from powershell's perspective, so they don't cause a parsing error. For example, if you use $HOME, you wouldn't get past the parsing stage since $HOME is not a constant from PowerShell's perspective. There are a very small set of variables which PowerShell considers constant.

This attribute is really looking for a set of constant strings

JamesWTruher avatar Mar 27 '24 22:03 JamesWTruher

Thanks for the explanation @JamesWTruher. Makes sense!

liamjpeters avatar Mar 28 '24 07:03 liamjpeters

Thanks for raising this and opening PR, will review

bergmeister avatar Apr 09 '24 11:04 bergmeister