Skip to content

errcheck doesn't detect all unchecked type assertion #882

Closed
@pierrre

Description

@pierrre

Thank you for creating the issue!

  • 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).

Please include the following information:

Version of golangci-lint
$ golangci-lint --version
golangci-lint has version 1.21.0 built from 645e794 on 2019-10-15T18:16:56Z
Config file
$ cat .golangci.yml
run:
  timeout: "10m"
linters:
  disable-all: true
  enable:
    - "bodyclose"
    - "deadcode"
    - "depguard"
    - "errcheck"
    - "gocritic"
    - "gocyclo"
    - "gofmt"
    - "goimports"
    - "golint"
    - "govet"
    - "ineffassign"
    - "megacheck"
    - "misspell"
    - "nakedret"
    - "structcheck"
    - "unconvert"
    - "unparam"
    - "varcheck"
linters-settings:
  depguard:
    list-type: blacklist
    include-go-root: true
    packages:
      - errors
      - reflect
      - unsafe
      - github.com/pkg/errors
  errcheck:
    check-type-assertions: true
  gocyclo:
    min-complexity: 10
  govet:
    enable-all: true
issues:
  exclude-use-default: false
  max-issues-per-linter: 0
  max-same-issues: 0
Go environment
$ go version && go env
go version go1.13.5 linux/amd64
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/pierre/.cache/go-build"
GOENV="/home/pierre/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/pierre/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/home/pierre/.gimme/versions/go1.13.5.src"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/home/pierre/.gimme/versions/go1.13.5.src/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/home/pierre/gosrc/github.com/xxx/yyy/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build810139123=/tmp/go-build -gno-record-gcc-switches"
Verbose output of running
$ golangci-lint run -v
INFO [config_reader] Config search paths: [./ /home/pierre/gosrc/github.com/xxx/yyy /home/pierre/gosrc/github.com/xxx /home/pierre/gosrc/github.com /home/pierre/gosrc /home/pierre /home /] 
INFO [config_reader] Used config file .golangci.yml 
INFO [lintersdb] Active 20 linters: [bodyclose deadcode depguard errcheck gocritic gocyclo gofmt goimports golint gosimple govet ineffassign misspell nakedret staticcheck structcheck unconvert unparam unused varcheck] 
INFO [loader] Go packages loading at mode 575 (exports_file|imports|compiled_files|deps|files|name|types_sizes) took 235.781777ms 
INFO [runner/filename_unadjuster] Pre-built 0 adjustments in 24.339956ms 
INFO [runner/goanalysis_metalinter/goanalysis] analyzers took 25.433211455s with top 10 stages: buildssa: 9.13999065s, goimports: 1.69246075s, gofmt: 1.231308728s, unparam: 922.471835ms, golint: 834.866973ms, ineffassign: 768.164647ms, misspell: 738.716443ms, gocritic: 684.814951ms, SA4014: 671.62614ms, deadcode: 632.376094ms 
INFO [runner/unused/goanalysis] analyzers took 1.973672294s with top 10 stages: buildssa: 1.441568036s, U1000: 532.104258ms 
INFO [runner] Issues before processing: 18, after processing: 0 
INFO [runner] Processors filtering stat (out/in): filename_unadjuster: 18/18, identifier_marker: 18/18, exclude: 18/18, path_prettifier: 18/18, skip_files: 18/18, autogenerated_exclude: 18/18, nolint: 0/18, cgo: 18/18, skip_dirs: 18/18, exclude-rules: 18/18 
INFO [runner] processing took 5.717866ms with stages: nolint: 5.046802ms, path_prettifier: 242.312µs, identifier_marker: 211.745µs, autogenerated_exclude: 109.443µs, skip_dirs: 98.829µs, cgo: 4.679µs, filename_unadjuster: 1.501µs, max_same_issues: 683ns, skip_files: 281ns, diff: 255ns, max_from_linter: 241ns, uniq_by_line: 187ns, exclude-rules: 187ns, path_shortener: 185ns, max_per_file_from_linter: 182ns, source_code: 182ns, exclude: 172ns 
INFO [runner] linters took 3.431985751s with stages: goanalysis_metalinter: 2.888784135s, unused: 537.425552ms 
INFO File cache stats: 382 entries of total size 1.2MiB 
INFO Memory: 38 samples, avg is 368.0MB, max is 610.1MB 
INFO Execution took 3.696656595s

I've configured errcheck to report unchecked type assertion.
However, in this code:

if filter["messages_sent.messageid"].(map[string]interface{})["$ne"] != nil {

the type assertion is not checked, but it's not reported.
filter is a bson.M from github.com/globalsign/mgo/bson.

Metadata

Metadata

Assignees

Labels

dependenciesRelates to an upstream dependencyfalse negativeAn error is not reported when one exists

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions