Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 16 additions & 11 deletions analyzer.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
"path"
"path/filepath"
"reflect"
"regexp"
"runtime/debug"
"strconv"
"strings"
Expand Down Expand Up @@ -761,20 +762,24 @@ func ParseErrors(pkg *packages.Package) (map[string][]Error, error) {
return nil, nil
}
errs := make(map[string][]Error)
posRegexp := regexp.MustCompile(`^(.*?)(?::(\w+))?(?::(\w+))?$`)
for _, pkgErr := range pkg.Errors {
parts := strings.Split(pkgErr.Pos, ":")
file := parts[0]
matches := posRegexp.FindStringSubmatch(pkgErr.Pos)
file := pkgErr.Pos
var err error
var line int
if len(parts) > 1 {
if line, err = strconv.Atoi(parts[1]); err != nil {
return nil, fmt.Errorf("parsing line: %w", err)
var line, column int
if len(matches) > 0 {
file = matches[1]
file = strings.TrimSuffix(file, ":")
if len(matches) > 2 && matches[2] != "" {
if line, err = strconv.Atoi(matches[2]); err != nil {
return nil, fmt.Errorf("parsing line: %w", err)
}
}
}
var column int
if len(parts) > 2 {
if column, err = strconv.Atoi(parts[2]); err != nil {
return nil, fmt.Errorf("parsing column: %w", err)
if len(matches) > 3 && matches[3] != "" {
if column, err = strconv.Atoi(matches[3]); err != nil {
return nil, fmt.Errorf("parsing column: %w", err)
}
}
}
msg := strings.TrimSpace(pkgErr.Msg)
Expand Down
31 changes: 30 additions & 1 deletion analyzer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,12 +85,17 @@ var _ = Describe("Analyzer", func() {
func bar(){
println("package has two files!")
}`)
pkg.AddFile("foo:bar.go", `
package main
func fooBar(){
println("package has another file!")
}`)
err := pkg.Build()
Expect(err).ShouldNot(HaveOccurred())
err = analyzer.Process(buildTags, pkg.Path)
Expect(err).ShouldNot(HaveOccurred())
_, metrics, _ := analyzer.Report()
Expect(metrics.NumFiles).To(Equal(2))
Expect(metrics.NumFiles).To(Equal(3))
})

It("should be able to analyze multiple Go files concurrently", func() {
Expand Down Expand Up @@ -1803,6 +1808,30 @@ func main() {
Expect(err).Should(HaveOccurred())
})

It("should properly parse the errors with colons in path", func() {
pkg := &packages.Package{
Errors: []packages.Error{
{
Pos: "C:\\file:1:2",
Comment thread
ccojocar marked this conversation as resolved.
Msg: "build error",
},
{
Pos: "file:100:1:2",
Msg: "build error",
},
},
}
errors, err := gosec.ParseErrors(pkg)
Expect(err).ShouldNot(HaveOccurred())
Expect(errors).To(HaveLen(2))
for _, ferr := range errors {
Expect(ferr).To(HaveLen(1))
Expect(ferr[0].Line).To(Equal(1))
Expect(ferr[0].Column).To(Equal(2))
Expect(ferr[0].Err).Should(MatchRegexp(`build error`))
}
})

It("should append error to the same file", func() {
pkg := &packages.Package{
Errors: []packages.Error{
Expand Down
Loading