aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/cover/html.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2024-04-09 08:46:39 +0200
committerTaras Madan <tarasmadan@google.com>2024-04-09 12:16:53 +0000
commit171ec3714ee4886a3f5ecbfe71f63c8f81c7fd7c (patch)
tree93f2d371ed75752275467bbce73d6387460b3eda /pkg/cover/html.go
parentb3198cd94cc221153d34443bc657c799ec47a2ed (diff)
pkg/cover: fix jsonl hit count calculation
prepareFileMap does more work than we need and leads to incorrect hit counts. prepareFileMap produces hit counts per source line (for source reports), but jsonl exports data based on coverage callbacks, not source lines. So if we have 2 callbacks on the same line, we will double count them (both will have hit count 2). If we calculate total percent later based on that data, it will be wrong. Use simpler calculation based on PCs.
Diffstat (limited to 'pkg/cover/html.go')
-rw-r--r--pkg/cover/html.go20
1 files changed, 11 insertions, 9 deletions
diff --git a/pkg/cover/html.go b/pkg/cover/html.go
index 319a61ddd..a3a9f0846 100644
--- a/pkg/cover/html.go
+++ b/pkg/cover/html.go
@@ -230,20 +230,22 @@ func (rg *ReportGenerator) DoCoverJSONL(w io.Writer, params CoverHandlerParams)
return fmt.Errorf("failed to symbolize PCs(): %w", err)
}
}
- var progs = fixUpPCs(rg.target.Arch, params.Progs, params.CoverFilter)
- fm, err := rg.prepareFileMap(progs, params.Debug)
- if err != nil {
- return fmt.Errorf("failed to rg.prepareFileMap(): %w", err)
+ progs := fixUpPCs(rg.target.Arch, params.Progs, params.CoverFilter)
+ if err := rg.symbolizePCs(uniquePCs(progs)); err != nil {
+ return err
+ }
+ progPCs := make(map[uint64]int)
+ for _, prog := range progs {
+ for _, pc := range prog.PCs {
+ progPCs[pc]++
+ }
}
-
encoder := json.NewEncoder(w)
for _, frame := range rg.Frames {
endCol := frame.Range.EndCol
if endCol == backend.LineEnd {
endCol = -1
}
- pcProgCount := FileByFrame(fm, &frame).lines[frame.StartLine].pcProgCount
- hitCount := pcProgCount[frame.PC]
covInfo := &CoverageInfo{
FilePath: frame.Name,
FuncName: frame.FuncName,
@@ -251,11 +253,11 @@ func (rg *ReportGenerator) DoCoverJSONL(w io.Writer, params CoverHandlerParams)
StartCol: frame.Range.StartCol,
EndLine: frame.Range.EndLine,
EndCol: endCol,
- HitCount: hitCount,
+ HitCount: progPCs[frame.PC],
Inline: frame.Inline,
PC: frame.PC,
}
- if err = encoder.Encode(covInfo); err != nil {
+ if err := encoder.Encode(covInfo); err != nil {
return fmt.Errorf("failed to json.Encode(): %w", err)
}
}