diff --git a/internal/govulncheck/callstacks.go b/internal/govulncheck/callstacks.go
index df861d9..14a7ce2 100644
--- a/internal/govulncheck/callstacks.go
+++ b/internal/govulncheck/callstacks.go
@@ -141,7 +141,7 @@
 		return ""
 	}
 
-	topPos := internal.AbsRelShorter(cs.Frames[iTop].Pos())
+	topPos := internal.AbsRelShorter(result.Pos(cs.Frames[iTop]))
 	if topPos != "" {
 		topPos += ": "
 	}
@@ -159,7 +159,7 @@
 	if iVulnStart != iTopEnd+1 {
 		// If there is something in between top and vuln segments of
 		// the stack, then also summarize that intermediate segment.
-		return fmt.Sprintf("%s%s calls %s, which eventually calls %s", topPos, topFunc, cs.Frames[iTopEnd+1].Name(), vulnFunc)
+		return fmt.Sprintf("%s%s calls %s, which eventually calls %s", topPos, topFunc, result.FuncName(cs.Frames[iTopEnd+1]), vulnFunc)
 	}
 	if vulnStartFunc != vulnFunc {
 		// The first function of the vuln segment is anonymous.
@@ -185,7 +185,7 @@
 		return -1, -1, "", ""
 	}
 
-	topEndFunc = frames[iTopEnd].Name()
+	topEndFunc = result.FuncName(frames[iTopEnd])
 	if !isAnonymousFunction(topEndFunc) {
 		iTop = iTopEnd
 		topFunc = topEndFunc
@@ -203,7 +203,7 @@
 		return
 	}
 
-	topFunc = frames[iTop].Name()
+	topFunc = result.FuncName(frames[iTop])
 	return
 }
 
@@ -225,7 +225,7 @@
 	}
 	iVulnStart += iTop + 1 // adjust for slice in call to highest.
 
-	vulnStartFunc = frames[iVulnStart].Name()
+	vulnStartFunc = result.FuncName(frames[iVulnStart])
 	if !isAnonymousFunction(vulnStartFunc) {
 		vulnFunc = vulnStartFunc
 		return
@@ -241,7 +241,7 @@
 		return
 	}
 
-	vulnFunc = frames[iVuln+iVulnStart].Name()
+	vulnFunc = result.FuncName(frames[iVuln+iVulnStart])
 	return
 }
 
diff --git a/internal/govulncheck/result_test.go b/internal/govulncheck/result_test.go
index d0d52c4..302043b 100644
--- a/internal/govulncheck/result_test.go
+++ b/internal/govulncheck/result_test.go
@@ -36,10 +36,10 @@
 			"",
 		},
 	} {
-		if got := test.sf.Name(); got != test.wantFunc {
+		if got := result.FuncName(test.sf); got != test.wantFunc {
 			t.Errorf("want %v func name; got %v", test.wantFunc, got)
 		}
-		if got := test.sf.Pos(); got != test.wantPos {
+		if got := result.Pos(test.sf); got != test.wantPos {
 			t.Errorf("want %v call position; got %v", test.wantPos, got)
 		}
 	}
@@ -79,7 +79,7 @@
 		{"not called - single module", vuln([2]string{"golang.org/p1", ""}), false},
 		{"not called - multi modules", vuln([2]string{"golang.org/p1", ""}, [2]string{"golang.org/p2", ""}), false},
 	} {
-		if test.v.IsCalled() != test.want {
+		if result.IsCalled(test.v) != test.want {
 			t.Errorf("want called=%t for %v; got the opposite", test.want, test.desc)
 		}
 	}
diff --git a/internal/govulncheck/text.go b/internal/govulncheck/text.go
index b454987..ebda9df 100644
--- a/internal/govulncheck/text.go
+++ b/internal/govulncheck/text.go
@@ -117,7 +117,7 @@
 	// TODO(https://go.dev/issue/58945): add a test for this
 	if source {
 		for _, v := range r.Vulns {
-			if v.IsCalled() {
+			if result.IsCalled(v) {
 				return ErrVulnerabilitiesFound
 			}
 		}
@@ -140,7 +140,7 @@
 	var unaffected []tmplVulnInfo
 	var affected []tmplVulnInfo
 	for _, v := range r.Vulns {
-		if !source || v.IsCalled() {
+		if !source || result.IsCalled(v) {
 			affected = append(affected, createTmplVulnInfo(v, verbose, source))
 		} else {
 			// save arbitrary module info for informational message
@@ -276,8 +276,8 @@
 	for _, cs := range css {
 		b.WriteString(fmt.Sprintf("#%d: for function %s\n", i, cs.Symbol))
 		for _, e := range cs.Frames {
-			b.WriteString(fmt.Sprintf("  %s\n", e.Name()))
-			if pos := internal.AbsRelShorter(e.Pos()); pos != "" {
+			b.WriteString(fmt.Sprintf("  %s\n", result.FuncName(e)))
+			if pos := internal.AbsRelShorter(result.Pos(e)); pos != "" {
 				b.WriteString(fmt.Sprintf("      %s\n", pos))
 			}
 		}
diff --git a/internal/result/result.go b/internal/result/result.go
index 16eceea..83e3b38 100644
--- a/internal/result/result.go
+++ b/internal/result/result.go
@@ -36,7 +36,7 @@
 
 // IsCalled reports whether the vulnerability is called, therefore
 // affecting the target source code or binary.
-func (v *Vuln) IsCalled() bool {
+func IsCalled(v *Vuln) bool {
 	for _, m := range v.Modules {
 		for _, p := range m.Packages {
 			if len(p.CallStacks) > 0 {
@@ -133,9 +133,9 @@
 	Position token.Position
 }
 
-// Name returns the full qualified function name from sf,
+// FuncName returns the full qualified function name from sf,
 // adjusted to remove pointer annotations.
-func (sf *StackFrame) Name() string {
+func FuncName(sf *StackFrame) string {
 	var n string
 	if sf.RecvType == "" {
 		n = fmt.Sprintf("%s.%s", sf.PkgPath, sf.FuncName)
@@ -147,7 +147,7 @@
 
 // Pos returns the position of the call in sf as string.
 // If position is not available, return "".
-func (sf *StackFrame) Pos() string {
+func Pos(sf *StackFrame) string {
 	if sf.Position.IsValid() {
 		return sf.Position.String()
 	}
