blob: e413ae7dba29bb139bb018ddaac817bcb92b7719 [file] [log] [blame]
// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package traces
import (
"golang.org/x/vuln/internal/govulncheck"
)
// Compact returns a summarization of finding.Trace. The first
// returned element is the vulnerable symbol and the last element
// is the exit point of the user module. There can also be two
// elements in between, if applicable, which are the two elements
// preceding the user module exit point.
func Compact(finding *govulncheck.Finding) []*govulncheck.Frame {
if len(finding.Trace) < 1 {
return nil
}
iTop := len(finding.Trace) - 1
topModule := finding.Trace[iTop].Module
// search for the exit point of the top module
for i, frame := range finding.Trace {
if frame.Module == topModule {
iTop = i
break
}
}
if iTop == 0 {
// all in one module, reset to the end
iTop = len(finding.Trace) - 1
}
compact := []*govulncheck.Frame{finding.Trace[0]}
if iTop > 1 {
if iTop > 2 {
compact = append(compact, finding.Trace[iTop-2])
}
compact = append(compact, finding.Trace[iTop-1])
}
if iTop > 0 {
compact = append(compact, finding.Trace[iTop])
}
return compact
}