diff options
| author | Cherry Zhang <cherryyz@google.com> | 2020-04-18 23:08:36 -0400 |
|---|---|---|
| committer | Cherry Zhang <cherryyz@google.com> | 2020-04-19 03:23:59 +0000 |
| commit | af9ab6b2e852c4177db06cf91edc7a869b4cb93e (patch) | |
| tree | f0cce77d09f2d7e10b1cccf06b61138ba1359d9e /src/cmd/link/internal/ld/deadcode2.go | |
| parent | a32262d4625e6f54cedd765e4807c215d1deb992 (diff) | |
| download | go-af9ab6b2e852c4177db06cf91edc7a869b4cb93e.tar.xz | |
cmd/link: check for reflect.Value.MethodByName explicitly
Currently we only check for reflect.Value.Method. And
reflect.Value.MethodByName is covered since it calls
reflect.Value.Method internally. But it is brittle to rely on
implementation detail of the reflect package. Check for
MethodByName explicitly.
Change-Id: Ifa8920e997524003dade03abc4fb3c4e64723643
Reviewed-on: https://go-review.googlesource.com/c/go/+/228881
Run-TryBot: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/cmd/link/internal/ld/deadcode2.go')
| -rw-r--r-- | src/cmd/link/internal/ld/deadcode2.go | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/cmd/link/internal/ld/deadcode2.go b/src/cmd/link/internal/ld/deadcode2.go index 1aa65aee78..93df626c21 100644 --- a/src/cmd/link/internal/ld/deadcode2.go +++ b/src/cmd/link/internal/ld/deadcode2.go @@ -220,6 +220,7 @@ func deadcode2(ctxt *Link) { d.flood() methSym := ldr.Lookup("reflect.Value.Method", sym.SymVerABIInternal) + methByNameSym := ldr.Lookup("reflect.Value.MethodByName", sym.SymVerABIInternal) if ctxt.DynlinkingGo() { // Exported methods may satisfy interfaces we don't know // about yet when dynamically linking. @@ -230,7 +231,7 @@ func deadcode2(ctxt *Link) { // Methods might be called via reflection. Give up on // static analysis, mark all exported methods of // all reachable types as reachable. - d.reflectSeen = d.reflectSeen || (methSym != 0 && ldr.AttrReachable(methSym)) + d.reflectSeen = d.reflectSeen || (methSym != 0 && ldr.AttrReachable(methSym)) || (methByNameSym != 0 && ldr.AttrReachable(methByNameSym)) // Mark all methods that could satisfy a discovered // interface as reachable. We recheck old marked interfaces |
