Skip to content

Incorrect reporting for uncheckedInlineErr (gocritic) #3628

@ennc0d3

Description

@ennc0d3

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

When running golangci-lint with gocritic with uncheckedInlineErr for a simple go program with cgo enabled, golangci-lint is producing incorrect reporting,

  • It is not able to point at the offending err variables
  • It starts to report even for correct statements. (something gets mixed up the rules matching logic?)

Example,

main.go:21:8: uncheckedInlineErr:  er error is unchecked, maybe intended to check it instead of  // (gocritic)
    if err = doIt(); err2 != nil { // expect to complain
       ^
main.go:25:8: uncheckedInlineErr:  val error is unchecked, maybe intended to check it instead of trin (gocritic)
    if err2 = doIt(); err2 != nil { // expect  no issue
       ^
main.go:32:8: uncheckedInlineErr: err2 error is unchecked, maybe intended to check it instead of err (gocritic)
    if err2 := doIt(); err != nil { // expect to complain

The err, err2 variables are declared earlier and I have marked the statements where I expect gocritic to complain, but looking report we can see golangci-lint/gocritic seems to be confused.

When I tried the same with the gocritic standalone binary it doesn't report anything at all which is also weird.

go install -v github.com/go-critic/go-critic/cmd/gocritic@v0.6.7
cd uncheckedInlineErr
gocritic check -v  --enable="uncheckedInlineErr" ./...

Maybe this is not the right way to invoke?

But I think anyway golangci-lint report is not working as expected or could it be because of some weird issues in my setup?

Thanks,

Version of golangci-lint

$ golangci-lint --version
golangci-lint has version 1.51.2 built from 3e8facb4 on 2023-02-19T21:43:54Z

Configuration file

$ cat .golangci.yml
linters:
  disable-all: true
  enable:
    - gocritic 

linters-settings:
  gocritic:
    enabled-checks:
      - uncheckedInlineErr

Go environment

$ go version && go env
go version go1.20.1 linux/amd64
GO111MODULE=""
GOARCH="amd64"
GOBIN="/home/enaggan/go/bin"
GOCACHE="/home/enaggan/.cache/go-build"
GOENV="/home/enaggan/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/enaggan/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/enaggan/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.20.1"
GCCGO="gccgo"
GOAMD64="v1"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/home/enaggan/uncheckedInlineErr/go.mod"
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-build3755390846=/tmp/go-build -gno-record-gcc-switches"

Verbose output of running

$ golangci-lint cache clean

INFO [config_reader] Config search paths: [./ /home/enn/uncheckedInlineErr /home/enn /home /] 
INFO [config_reader] Used config file .golangci.yml 

$ golangci-lint run -v
IINFO [config_reader] Config search paths: [./ /home/enn/uncheckedInlineErr /home/enn /home /] 
INFO [config_reader] Used config file .golangci.yml 
INFO [lintersdb] Active 1 linters: [gocritic]     
INFO [loader] Go packages loading at mode 575 (compiled_files|exports_file|files|imports|name|deps|types_sizes) took 45.368767ms 
INFO [runner/filename_unadjuster] Pre-built 0 adjustments in 213.543µs 
INFO [linters_context/goanalysis] analyzers took 673.896µs with top 10 stages: gocritic: 673.896µs 
INFO [runner] Processors filtering stat (out/in): skip_files: 3/3, exclude: 3/3, max_from_linter: 3/3, path_shortener: 3/3, sort_results: 3/3, autogenerated_exclude: 3/3, uniq_by_line: 3/3, diff: 3/3, max_per_file_from_linter: 3/3, max_same_issues: 3/3, severity-rules: 3/3, path_prefixer: 3/3, filename_unadjuster: 3/3, path_prettifier: 3/3, skip_dirs: 3/3, exclude-rules: 3/3, nolint: 3/3, source_code: 3/3, cgo: 3/3, identifier_marker: 3/3 
INFO [runner] processing took 327.237µs with stages: exclude-rules: 108.287µs, nolint: 86.012µs, identifier_marker: 71.285µs, autogenerated_exclude: 27.977µs, source_code: 10.968µs, path_prettifier: 9.537µs, skip_dirs: 3.962µs, max_same_issues: 2.211µs, uniq_by_line: 1.894µs, cgo: 1.098µs, max_from_linter: 1.04µs, skip_files: 691ns, path_shortener: 638ns, filename_unadjuster: 523ns, max_per_file_from_linter: 277ns, exclude: 234ns, diff: 214ns, severity-rules: 202ns, sort_results: 116ns, path_prefixer: 71ns 
INFO [runner] linters took 247.49308ms with stages: gocritic: 247.116063ms 
main.go:21:8: uncheckedInlineErr:  er error is unchecked, maybe intended to check it instead of  // (gocritic)
    if err = doIt(); err2 != nil { // expect to complain
       ^
main.go:25:8: uncheckedInlineErr:  val error is unchecked, maybe intended to check it instead of trin (gocritic)
    if err2 = doIt(); err2 != nil { // expect  no issue
       ^
main.go:32:8: uncheckedInlineErr: err2 error is unchecked, maybe intended to check it instead of err (gocritic)
    if err2 := doIt(); err != nil { // expect to complain
       ^
INFO File cache stats: 1 entries of total size 584B 
INFO Memory: 4 samples, avg is 48.9MB, max is 60.3MB 
INFO Execution took 297.273113ms                  

Code example or link to a public repository

cat go.mod
module gocheck

go 1.20

cat main.go
[uncheckedInlineErr.zip](https://github.com/golangci/golangci-lint/files/10813251/uncheckedInlineErr.zip)

package main
/*
char *Test() {
    char *msg = "HelloTest";
    return msg;
}
*/
import "C"

import (
    "fmt"
    "errors"
)

func doIt() error {
    return errors.New("error case")
}

func main() {
    var err, err2 error
    if err = doIt(); err2 != nil { // expect to complain
        fmt.Println(err)
    }

    if err2 = doIt(); err2 != nil { // expect  no issue
        fmt.Println(err2)
    }
    cs := C.Test()
    value := C.GoString(cs)
    fmt.Printf("Cgo string: %s\n", value)

    if err2 := doIt(); err != nil { // expect to complain
        fmt.Println(err2)
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: cgoRelated to CGO or line directivesbugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      pFad - Phonifier reborn

      Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

      Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


      Alternative Proxies:

      Alternative Proxy

      pFad Proxy

      pFad v3 Proxy

      pFad v4 Proxy