Fix #139: don't fail govet on cgo

This commit is contained in:
Denis Isaev 2018-06-30 09:13:13 +03:00 committed by Isaev Denis
parent 6dd4f07c50
commit 3ce87e6245
5 changed files with 82 additions and 2 deletions

View File

@ -3,8 +3,10 @@ package lint
import (
"context"
"fmt"
"go/ast"
"go/build"
"go/parser"
"go/token"
"os"
"path/filepath"
"strings"
@ -12,6 +14,7 @@ import (
"github.com/golangci/golangci-lint/pkg/goutils"
"github.com/golangci/golangci-lint/pkg/logutils"
"github.com/golangci/golangci-lint/pkg/result/processors"
"github.com/golangci/go-tools/ssa"
"github.com/golangci/go-tools/ssa/ssautil"
@ -258,6 +261,30 @@ func separateNotCompilingPackages(lintCtx *linter.Context) {
}
}
func removeFakePkgFiles(info *loader.PackageInfo, fset *token.FileSet) {
newFiles := make([]*ast.File, 0, len(info.Files))
for _, f := range info.Files {
if !processors.IsCgoFilename(fset.Position(f.Pos()).Filename) {
newFiles = append(newFiles, f)
}
}
info.Files = newFiles
}
func removeFakePackages(prog *loader.Program) {
if prog.Created != nil {
for _, info := range prog.Created {
removeFakePkgFiles(info, prog.Fset)
}
}
if prog.Imported != nil {
for _, info := range prog.Imported {
removeFakePkgFiles(info, prog.Fset)
}
}
}
//nolint:gocyclo
func LoadContext(ctx context.Context, linters []linter.Config, cfg *config.Config,
log logutils.Log) (*linter.Context, error) {
@ -298,6 +325,10 @@ func LoadContext(ctx context.Context, linters []linter.Config, cfg *config.Confi
ssaProg = buildSSAProgram(ctx, prog, log)
}
if prog != nil {
removeFakePackages(prog)
}
astLog := log.Child("astcache")
var astCache *astcache.Cache
if prog != nil {

View File

@ -2,7 +2,7 @@ package processors
import (
"fmt"
"strings"
"path/filepath"
"github.com/golangci/golangci-lint/pkg/result"
)
@ -47,5 +47,5 @@ func transformIssues(issues []result.Issue, transform func(i *result.Issue) *res
}
func IsCgoFilename(f string) bool {
return f == "C" || strings.HasSuffix(f, "/C")
return filepath.Base(f) == "C"
}

View File

@ -131,6 +131,22 @@ func TestTestsAreLintedByDefault(t *testing.T) {
assert.Equal(t, exitcodes.Success, exitCode, out)
}
func TestCgoOk(t *testing.T) {
out, exitCode := runGolangciLint(t, "--enable-all", filepath.Join(testdataDir, "cgo"))
checkNoIssuesRun(t, out, exitCode)
}
func TestUnsafeOk(t *testing.T) {
out, exitCode := runGolangciLint(t, "--enable-all", filepath.Join(testdataDir, "unsafe"))
checkNoIssuesRun(t, out, exitCode)
}
func TestDeadcodeNoFalsePositivesInMainPkg(t *testing.T) {
out, exitCode := runGolangciLint(t, "--no-config", "--disable-all", "-Edeadcode",
filepath.Join(testdataDir, "deadcode_main_pkg"))
checkNoIssuesRun(t, out, exitCode)
}
func TestConfigFileIsDetected(t *testing.T) {
checkGotConfig := func(out string, exitCode int) {
assert.Equal(t, exitcodes.Success, exitCode, out)

19
test/testdata/cgo/main.go vendored Normal file
View File

@ -0,0 +1,19 @@
package cgoexample
/*
#include <stdio.h>
#include <stdlib.h>
void myprint(char* s) {
printf("%d\n", s);
}
*/
import "C"
import "unsafe"
func Example() {
cs := C.CString("Hello from stdio\n")
C.myprint(cs)
C.free(unsafe.Pointer(cs))
}

14
test/testdata/unsafe/pkg.go vendored Normal file
View File

@ -0,0 +1,14 @@
package pkg
import (
"log"
"unsafe"
)
func F() {
x := 123 // of type int
p := unsafe.Pointer(&x)
pp := &p // of type *unsafe.Pointer
p = unsafe.Pointer(pp)
log.Print(p)
}