Skip to content

nolintlint: respect build constraints #3833

Open
@leonklingele

Description

@leonklingele

Welcome

  • Yes, I'm using a binary release within 2 latest major releases. Only such installations are supported.
  • Yes, I've searched similar issues on GitHub and didn't find any.
  • Yes, I've included all information below (version, config, etc.).
  • Yes, I've tried with the standalone linter if available (e.g., gocritic, go vet, etc.). (https://golangci-lint.run/usage/linters/)

Description of the problem

Please excuse if this is not the appropriate place to report this issue at. I don't know the exact reason why the problem described in the following occurs. To me it seems the nolintlint evaluator doesn't respect Go build constraints.

I was working on this PR: gofiber/fiber#2462

The golangci-lint CI action was failing on a file having a Go build constraint of //go:build go1.20` due to `Error: directive `//nolint:gosec // unsafe is used for better performance here` is unused for linter "gosec" (nolintlint).
See the failing job here: https://github.com/gofiber/fiber/actions/runs/4968641325/jobs/8891360463.

The issue was fixed by removing the nolint:gosec directive, although unsafe package was used. See this commit:
gofiber/fiber@bcefaac

For another file depending on Go < 1.20, the nolint directive however was correctly identified & used: https://github.com/gofiber/fiber/blob/bcefaaca110919a8f9e1a357dd639408b0f0cfac/utils/convert_s2b_old.go#L16

Version of golangci-lint

Run golangci/golangci-lint-action@v3
  with:
    version: v1.51.0
    github-token: ***
    only-new-issues: false
    skip-cache: false
    skip-pkg-cache: false
    skip-build-cache: false

prepare environment
  Checking for go.mod: go.mod
  Finding needed golangci-lint version...
  Installing golangci-lint v1.51.0...
  Downloading https://github.com/golangci/golangci-lint/releases/download/v1.51.0/golangci-lint-1.51.0-linux-amd64.tar.gz ...
  Cache not found for input keys: golangci-lint.cache-[2](https://github.com/gofiber/fiber/actions/runs/4968641325/jobs/8891360463#step:4:2)784-4060f4964adef5e6ff14aa501850a90ee8[3](https://github.com/gofiber/fiber/actions/runs/4968641325/jobs/8891360463#step:4:3)66fde, golangci-lint.cache-278[4](https://github.com/gofiber/fiber/actions/runs/4968641325/jobs/8891360463#step:4:4)-
  /usr/bin/tar xz --overwrite --warning=no-unknown-keyword --overwrite -C /home/runner -f /home/runner/work/_temp/87d13fd[5](https://github.com/gofiber/fiber/actions/runs/4968641325/jobs/8891360463#step:4:5)-1[6](https://github.com/gofiber/fiber/actions/runs/4968641325/jobs/8891360463#step:4:6)0b-4b[7](https://github.com/gofiber/fiber/actions/runs/4968641325/jobs/8891360463#step:4:7)f-917c-[8](https://github.com/gofiber/fiber/actions/runs/4968641325/jobs/8891360463#step:4:8)cd[9](https://github.com/gofiber/fiber/actions/runs/4968641325/jobs/8891360463#step:4:10)6c00eda6
  Installed golangci-lint into /home/runner/golangci-lint-1.51.0-linux-amd64/golangci-lint in 874ms
  Prepared env in 878ms

Configuration file

https://github.com/gofiber/fiber/blob/77c1b4868a686254a839fbbb88d7f46cbadb055a/.golangci.yml

# Created based on v1.51.0
# NOTE: Keep this in sync with the version in .github/workflows/linter.yml

run:
  modules-download-mode: readonly
  skip-dirs-use-default: false
  skip-dirs:
    - internal

output:
  sort-results: true

linters-settings:
  errcheck:
     check-type-assertions: true
     check-blank: true
     disable-default-exclusions: true

  errchkjson:
    report-no-exported: true

  exhaustive:
    default-signifies-exhaustive: true

  forbidigo:
    forbid:
      - ^(fmt\.Print(|f|ln)|print|println)$
      - 'http\.Default(Client|Transport)'
      # TODO: Eventually enable these patterns
      # - 'time\.Sleep'
      # - 'panic'

  gocritic:
    disabled-checks:
      - ifElseChain

  gofumpt:
    module-path: github.com/gofiber/fiber
    extra-rules: true

  gosec:
    config:
      global:
        audit: true

  govet:
    check-shadowing: true
    enable-all: true
    disable:
      - shadow
      - fieldalignment
      - loopclosure

  grouper:
    import-require-single-import: true
    import-require-grouping: true

  misspell:
    locale: US

  nolintlint:
    require-explanation: true
    require-specific: true

  nonamedreturns:
    report-error-in-defer: true

  predeclared:
    q: true

  promlinter:
    strict: true

  revive:
    enable-all-rules: true
    rules:
      # Provided by gomnd linter
      - name: add-constant
        disabled: true
      - name: argument-limit
        disabled: true
      # Provided by bidichk
      - name: banned-characters
        disabled: true
      - name: cognitive-complexity
        disabled: true
      - name: cyclomatic
        disabled: true
      - name: early-return
        severity: warning
        disabled: true
      - name: exported
        disabled: true
      - name: file-header
        disabled: true
      - name: function-result-limit
        disabled: true
      - name: function-length
        disabled: true
      - name: line-length-limit
        disabled: true
      - name: max-public-structs
        disabled: true
      - name: modifies-parameter
        disabled: true
      - name: nested-structs
        disabled: true
      - name: package-comments
        disabled: true

  stylecheck:
    checks:
      - all
      - -ST1000
      - -ST1020
      - -ST1021
      - -ST1022

  tagliatelle:
    case:
      rules:
        json: snake

  #tenv:
  #  all: true

  #unparam:
  #  check-exported: true

  wrapcheck:
    ignorePackageGlobs:
      - github.com/gofiber/fiber/*
      - github.com/valyala/fasthttp

issues:
   exclude-use-default: false

linters:
  enable:
    - asasalint
    - asciicheck
    - bidichk
    - bodyclose
    - containedctx
    - contextcheck
    - depguard
    - dogsled
    - durationcheck
    - errcheck
    - errchkjson
    - errname
    - errorlint
    - execinquery
    - exhaustive
    - exportloopref
    - forbidigo
    - forcetypeassert
    - goconst
    - gocritic
    - gofmt
    - gofumpt
    - goimports
    - gomoddirectives
    - goprintffuncname
    - gosec
    - gosimple
    - govet
    - grouper
    - loggercheck
    - misspell
    - nakedret
    - nilerr
    - nilnil
    - noctx
    - nolintlint
    - nonamedreturns
    - nosprintfhostport
    - predeclared
    - promlinter
    - reassign
    - revive
    - rowserrcheck
    - sqlclosecheck
    - staticcheck
    - stylecheck
    - tagliatelle
    # - testpackage # TODO: Enable once https://github.com/gofiber/fiber/issues/2252 is implemented
    - thelper
    # - tparallel # TODO: Enable once https://github.com/gofiber/fiber/issues/2254 is implemented
    - typecheck
    - unconvert
    - unparam
    - unused
    - usestdlibvars
    - wastedassign
    - whitespace
    - wrapcheck

Go environment

Run actions/setup-go@v4
  with:
    go-version: 1.[2](https://github.com/gofiber/fiber/actions/runs/4968641325/jobs/8891360463#step:2:2)0.x
    check-latest: false
    token: ***
    cache: true
Setup go version spec 1.20.x
Found in cache @ /opt/hostedtoolcache/go/1.20.[4](https://github.com/gofiber/fiber/actions/runs/4968641325/jobs/8891360463#step:2:4)/x[6](https://github.com/gofiber/fiber/actions/runs/4968641325/jobs/8891360463#step:2:6)4
Added go to the path
Successfully set up Go version 1.20.x
/opt/hostedtoolcache/go/1.20.4/x64/bin/go env GOMODCACHE
/opt/hostedtoolcache/go/1.20.4/x64/bin/go env GOCACHE
/home/runner/go/pkg/mod
/home/runner/.cache/go-build
Warning: Restore cache failed: Dependencies file is not found in /home/runner/work/fiber/fiber. Supported file pattern: go.sum
go version go1.20.4 linux/amd64

go env
  GO111MODULE=""
  GOARCH="amd64"
  GOBIN=""
  GOCACHE="/home/runner/.cache/go-build"
  GOENV="/home/runner/.config/go/env"
  GOEXE=""
  GOEXPERIMENT=""
  GOFLAGS=""
  GOHOSTARCH="amd64"
  GOHOSTOS="linux"
  GOINSECURE=""
  GOMODCACHE="/home/runner/go/pkg/mod"
  GONOPROXY=""
  GONOSUMDB=""
  GOOS="linux"
  GOPATH="/home/runner/go"
  GOPRIVATE=""
  GOPROXY="https://proxy.golang.org,direct"
  GOROOT="/opt/hostedtoolcache/go/1.20.4/x64"
  GOSUMDB="sum.golang.org"
  GOTMPDIR=""
  GOTOOLDIR="/opt/hostedtoolcache/go/1.20.4/x64/pkg/tool/linux_amd64"
  GOVCS=""
  GOVERSION="go1.20.4"
  GCCGO="gccgo"
  GOAMD64="v1"
  AR="ar"
  CC="gcc"
  CXX="g++"
  CGO_ENABLED="1"
  GOMOD="/dev/null"
  GOWORK=""
  CGO_CFLAGS="-O2 -g"
  CGO_CPPFLAGS=""
  CGO_CXXFLAGS="-O2 -g"
  CGO_FFLAGS="-O2 -g"
  CGO_LDFLAGS="-O2 -g"
  PKG_CONFIG="pkg-config"
  GOGCCFLAGS="-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build[19](https://github.com/gofiber/fiber/actions/runs/4968641325/jobs/8891360463#step:2:20)6036[35](https://github.com/gofiber/fiber/actions/runs/4968641325/jobs/8891360463#step:2:36)90=/tmp/go-build -gno-record-gcc-switches"

Verbose output of running

run golangci-lint
  Running [/home/runner/golangci-lint-1.51.0-linux-amd64/golangci-lint run --out-format=github-actions] in [] ...
  Error: directive `//nolint:gosec // unsafe is used for better performance here` is unused for linter "gosec" (nolintlint)
  
  level=warning msg="[linters_context] rowserrcheck is disabled because of generics. You can track the evolution of the generics support by following the https://github.com/golangci/golangci-lint/issues/2649."
  level=warning msg="[linters_context] sqlclosecheck is disabled because of generics. You can track the evolution of the generics support by following the https://github.com/golangci/golangci-lint/issues/2649."
  level=warning msg="[linters_context] wastedassign is disabled because of generics. You can track the evolution of the generics support by following the https://github.com/golangci/golangci-lint/issues/2649."
  level=error msg="Timeout exceeded: try increasing it by passing --timeout option"
  
  Error: golangci-lint exit with code 4
  Ran golangci-lint in 71644ms

Code example or link to a public repository

gofiber/fiber#2462

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: nolintRelated to nolint directive and nolintlint

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions