Skip to content

bug: comportamento do matching de severity override mudou silenciosamente na refatoração para matchSeverityOverride #35

Closed

Description

@joaooncode

Problema

O loop original de severity override embutido em classifyFinding usava um break incondicional fora do switch, então sempre parava no primeiro pattern que desse match — mesmo que override.Severity fosse uma string não reconhecida (caso em que a severidade simplesmente permanecia inalterada). Ao extrair essa lógica para Scanner.matchSeverityOverride (para reuso no teto de severidade dos secret matches), os return passaram a ficar dentro dos cases do switch, então um override que der match com uma severidade não reconhecida não interrompe mais o loop — ele continua verificando os overrides seguintes.

Cenário de falha

Isso normalmente não é alcançável via config YAML, já que config.Parse/Validate já rejeitam valores de severity inválidos em severity_overrides. Só é alcançável quando um config.Config é montado programaticamente, sem passar por Validate() — o que vários testes existentes já fazem via scanner.NewWithConfig. Nesse caso: dois SeverityOverrides dão match no mesmo arquivo, o primeiro tem uma Severity inválida/com erro de digitação, e o segundo é um override diferente e não intencional. Antes, o primeiro match (sem efeito) venceria, deixando a severidade pré-calculada intacta; agora o segundo override passa a valer silenciosamente.

Correção sugerida

Preservar a semântica de "parar no primeiro pattern que der match, independente da severidade ser reconhecida ou não" em matchSeverityOverride, ou decidir explicitamente (documentando e testando) que o novo comportamento — pular overrides com severidade não reconhecida e seguir para o próximo match — é intencional.

Contexto

  • Encontrado durante o code review da branch feat/secret-scanning (commit 40a4708). Este é um caso de borda, não alcançável via config YAML normal.
  • Arquivo: internal/scanner/scanner.go:223 (matchSeverityOverride)

Activity

  1. added
    bugSomething isn't working
    coreCore engine, scanning, and detectors
    ready-for-agentFully specified, ready for an AFK agent
    on Sep 11, 2026
  2. changed the title [-]bug: severity-override matching changed silently when refactored into matchSeverityOverride[/-] [+]bug: comportamento do matching de severity override mudou silenciosamente na refatoração para matchSeverityOverride[/+] on Sep 11, 2026
  3. joaooncode commented on Sep 12, 2026

    @joaooncode
    OwnerAuthor

    Corrigido em 2672b59.

    O que estava errado: o loop original de severity override embutido em classifyFinding tinha um break incondicional fora do switch, então sempre parava no primeiro pattern que desse match — mesmo com uma Severity não reconhecida (nesse caso, sem efeito, severidade pré-calculada intacta). Ao extrair essa lógica para Scanner.matchSeverityOverride, os return passaram a ficar dentro dos cases do switch, então um match com severidade não reconhecida deixava de interromper o loop, permitindo que um override seguinte (não intencional) vencesse silenciosamente.

    O que mudou: internal/scanner/scanner.go — matchSeverityOverride agora tem um default explícito no switch que retorna ("", false), preservando a semântica original de "parar no primeiro pattern que der match, independentemente de a severidade ser reconhecida ou não".

    Como foi verificado: adicionado TestMatchSeverityOverrideStopsAtFirstMatchEvenWhenUnrecognized em internal/scanner/scanner_test.go, construindo um config.Config programaticamente (sem passar por Validate(), como já fazem outros testes via NewWithConfig) com dois overrides que dão match no mesmo path — o primeiro com severidade inválida — e confirmando que nenhum override é aplicado. go build ./..., go vet ./... e go test ./... passando.

    Como o próprio issue observa, esse é um caso de borda não alcançável via config YAML normal (já rejeitado por Validate()), então optei por preservar o comportamento original em vez de tornar o "pular para o próximo override" um comportamento intencional.

  4. added a commit that references this issue on Sep 12, 2026
    7190979
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingcoreCore engine, scanning, and detectorsready-for-agentFully specified, ready for an AFK agent

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions