google / google/pprof

Off-by-1 error in Disasm end address

Open
#450 3 comments 0 reactions 0 assignees View on GitHub
Priority: p3 type: bug
Dominant language
Go
Stars
9.3k
Forks
671
Avg merge
1d 11h
Merged PRs (30d)
10

Description

### What version of pprof are you using?

If you are using pprof via `go tool pprof`, what's your `go env` output?
Go tip (8c10ce164f5b0244f3e08424c13666801b7c5973)

If you run pprof from GitHub, what's the Git revision?
tip (e84dfd68c163c45ea47aa24b3dc7eaa93f6675b1)

### What operating system and processor architecture are you using?
Linux/AMD64

### What did you do?

`Disasm` is called with a `Sym`'s `End` as the end address. `Sym.End` is the `virtual address of last byte in sym (Start+size-1)` (internal/plugin/plugin.go:176) whereas `Disasm` is `stopping at (before) the end address` (internal/plugin/plugin.go:124), i.e. `end` should be the address after the last instruction. I've seen the last instruction of a function not disassembled correctly, with both binutils and the Go objdump.

The following patch fixes this. Sorry I don't know how to add a test for this.

```
diff --git a/internal/report/report.go b/internal/report/report.go
index fb67a34..8208f89 100644
--- a/internal/report/report.go
+++ b/internal/report/report.go
@@ -421,7 +421,7 @@ func PrintAssembly(w io.Writer, rpt *Report, obj plugin.ObjTool, maxFuncs int) e
flatSum, cumSum := sns.Sum()

// Get the function assembly.
- insts, err := obj.Disasm(s.sym.File, s.sym.Start, s.sym.End)
+ insts, err := obj.Disasm(s.sym.File, s.sym.Start, s.sym.End+1)
if err != nil {
return err
}
diff --git a/internal/report/source.go b/internal/report/source.go
index ab8b64c..5dbd173 100644
--- a/internal/report/source.go
+++ b/internal/report/source.go
@@ -248,7 +248,7 @@ func assemblyPerSourceLine(objSyms []*objSymbol, rs graph.Nodes, src string, obj
}

// Extract assembly for matched symbol
- insts, err := obj.Disasm(o.sym.File, o.sym.Start, o.sym.End)
+ insts, err := obj.Disasm(o.sym.File, o.sym.Start, o.sym.End+1)
if err != nil {
return assembly
}
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.