PSAvoidAssignmentToAutomaticVariable generates false positives during script analysis

Aberta
#1,532 2 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
3/5
Tempo estimado
1-2 dias
Facilidade para iniciantes
35/100
Tipo de issue
Bug
Clareza
Razoavelmente clara
Status de atividade
Estagnada
Stack de tecnologia
csharp, powershell
Domínio
tooling

Direção de pesquisa

Comece executando a função Write-Log fornecida por meio do PSScriptAnalyzer e inspecionando a regra PSAvoidAssignmentToAutomaticVariable que reporta o parâmetro $Error. Confirme o diagnóstico com base no comportamento de escopo do PowerShell declarado; considera-se concluído quando este caso não for reportado e o texto do diagnóstico for corrigido se ele continuar aplicável em outro lugar.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

Area - Rules Issue - Bug Need Repro Info

Steps to reproduce

Run this function through PSSA.

function Write-Log {
    [CmdletBinding()]
    param
    (
        [Parameter(Position = 0, Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]
        $Message,

        [switch]
        $Error
    )
    $callerEAP = $ErrorActionPreference
    try {
        $messageColor = if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey('Error') -and $Error) {
            [ConsoleColor]::Red
        } else {
            [ConsoleColor]::Cyan
        }

        Write-Host -Foreground $messageColor -Object $Message

        # Reset colors to return to default after an error message on a compilation error
        [System.Console]::ResetColor()
    } catch {
        Write-Error -ErrorRecord $_ -ErrorAction $callerEAP
    }
}

Expected behavior

It passes.

Actual behavior

PSSA reports the following:

The Variable 'Error' cannot be assigned since it is a readonly automatic variable that is built into PowerShell, please use a different name.

There are a number of problems with this:

  1. The comma should be a period for it to read properly.
  2. The error text is incorrect. $Error can be assigned in child scopes without issue. $Error is read-only only in the global scope, and errors are automatically written into that globally-scoped collection that is read-only from PowerShell. In functions, or child scopes, you can use a $Error variable to your hearts content.
  3. Most importantly: the issue that is being called out by PSSA here should not be called out at all.

Environment data

> $PSVersionTable
Name                           Value
----                           -----
PSVersion                      7.0.1
PSEdition                      Core
GitCommitId                    7.0.1
OS                             Microsoft Windows 10.0.18363
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0
> (Get-Module -ListAvailable PSScriptAnalyzer).Version | ForEach-Object { $_.ToString() }
1.19.0
Linguagem predominante
C#
Estrelas
2.2k
Forks
415
Merge médio
13h 1min
PRs com merge (30d)
2

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de PowerShell/PSScriptAnalyzer

Todas as issues de PowerShell/PSScriptAnalyzer

Issues semelhantes

Mais issues de C#

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.