| // 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 |
| } |