From: Russ Cox Date: Wed, 8 May 2019 22:46:04 +0000 (-0400) Subject: cmd/internal/bio: rename Reader.Seek to MustSeek X-Git-Tag: go1.13beta1~359 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=ffd7eba20a0b21e2af038ed4bedfe4a052aa22b7;p=gostls13.git cmd/internal/bio: rename Reader.Seek to MustSeek Renaming the method makes clear, both to readers and to vet, that this method is not the implementation of io.Seeker: it cannot fail. Working toward making the tree vet-safe instead of having so many exceptions in cmd/vet/all/whitelist. For #31916. Change-Id: I3e6ad7264cb0121b4b76935450cccb71d533e96b Reviewed-on: https://go-review.googlesource.com/c/go/+/176108 Run-TryBot: Russ Cox TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements Reviewed-by: Brad Fitzpatrick --- diff --git a/src/cmd/compile/internal/gc/iimport.go b/src/cmd/compile/internal/gc/iimport.go index 51b57ce0a8..38a7201a63 100644 --- a/src/cmd/compile/internal/gc/iimport.go +++ b/src/cmd/compile/internal/gc/iimport.go @@ -117,7 +117,7 @@ func iimport(pkg *types.Pkg, in *bio.Reader) { stringData := data[:sLen] declData := data[sLen:] - in.Seek(int64(sLen+dLen), os.SEEK_CUR) + in.MustSeek(int64(sLen+dLen), os.SEEK_CUR) p := &iimporter{ ipkg: pkg, diff --git a/src/cmd/compile/internal/gc/obj.go b/src/cmd/compile/internal/gc/obj.go index 0a421729f4..c85268c120 100644 --- a/src/cmd/compile/internal/gc/obj.go +++ b/src/cmd/compile/internal/gc/obj.go @@ -97,13 +97,13 @@ func finishArchiveEntry(bout *bio.Writer, start int64, name string) { if size&1 != 0 { bout.WriteByte(0) } - bout.Seek(start-ArhdrSize, 0) + bout.MustSeek(start-ArhdrSize, 0) var arhdr [ArhdrSize]byte formathdr(arhdr[:], name, size) bout.Write(arhdr[:]) bout.Flush() - bout.Seek(start+size+(size&1), 0) + bout.MustSeek(start+size+(size&1), 0) } func dumpCompilerObj(bout *bio.Writer) { diff --git a/src/cmd/internal/bio/buf.go b/src/cmd/internal/bio/buf.go index 544f7edca9..470c9797b2 100644 --- a/src/cmd/internal/bio/buf.go +++ b/src/cmd/internal/bio/buf.go @@ -43,7 +43,7 @@ func Open(name string) (*Reader, error) { return &Reader{f: f, Reader: bufio.NewReader(f)}, nil } -func (r *Reader) Seek(offset int64, whence int) int64 { +func (r *Reader) MustSeek(offset int64, whence int) int64 { if whence == 1 { offset -= int64(r.Buffered()) } @@ -55,7 +55,7 @@ func (r *Reader) Seek(offset int64, whence int) int64 { return off } -func (w *Writer) Seek(offset int64, whence int) int64 { +func (w *Writer) MustSeek(offset int64, whence int) int64 { if err := w.Flush(); err != nil { log.Fatalf("writing output: %v", err) } diff --git a/src/cmd/internal/bio/buf_mmap.go b/src/cmd/internal/bio/buf_mmap.go index b8c78b3311..4b43d74f26 100644 --- a/src/cmd/internal/bio/buf_mmap.go +++ b/src/cmd/internal/bio/buf_mmap.go @@ -57,6 +57,6 @@ func (r *Reader) sliceOS(length uint64) ([]byte, bool) { } data = data[off-aoff:] - r.Seek(int64(length), 1) + r.MustSeek(int64(length), 1) return data, true } diff --git a/src/cmd/link/internal/ld/ar.go b/src/cmd/link/internal/ld/ar.go index f41e30d6e7..4a20d96f96 100644 --- a/src/cmd/link/internal/ld/ar.go +++ b/src/cmd/link/internal/ld/ar.go @@ -126,7 +126,7 @@ func hostArchive(ctxt *Link, name string) { libgcc := sym.Library{Pkg: "libgcc"} h := ldobj(ctxt, f, &libgcc, l, pname, name) - f.Seek(h.off, 0) + f.MustSeek(h.off, 0) h.ld(ctxt, f, h.pkg, h.length, h.pn) } diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index cd7f21cec9..49f3b3c0d7 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -741,7 +741,7 @@ func nextar(bp *bio.Reader, off int64, a *ArHdr) int64 { if off&1 != 0 { off++ } - bp.Seek(off, 0) + bp.MustSeek(off, 0) var buf [SAR_HDR]byte if n, err := io.ReadFull(bp, buf[:]); err != nil { if n == 0 && err != io.EOF { @@ -864,8 +864,8 @@ func loadobjfile(ctxt *Link, lib *sym.Library) { } /* load it as a regular file */ - l := f.Seek(0, 2) - f.Seek(0, 0) + l := f.MustSeek(0, 2) + f.MustSeek(0, 0) ldobj(ctxt, f, lib, l, lib.File, lib.File) return } @@ -985,7 +985,7 @@ func hostobjs(ctxt *Link) { Exitf("cannot reopen %s: %v", h.pn, err) } - f.Seek(h.off, 0) + f.MustSeek(h.off, 0) h.ld(ctxt, f, h.pkg, h.length, h.pn) f.Close() } @@ -1607,7 +1607,7 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, c2 := bgetc(f) c3 := bgetc(f) c4 := bgetc(f) - f.Seek(start, 0) + f.MustSeek(start, 0) magic := uint32(c1)<<24 | uint32(c2)<<16 | uint32(c3)<<8 | uint32(c4) if magic == 0x7f454c46 { // \x7F E L F @@ -1740,9 +1740,9 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, import1 := f.Offset() - f.Seek(import0, 0) + f.MustSeek(import0, 0) ldpkg(ctxt, f, lib, import1-import0-2, pn) // -2 for !\n - f.Seek(import1, 0) + f.MustSeek(import1, 0) flags := 0 switch *FlagStrictDups { diff --git a/src/cmd/link/internal/loadelf/ldelf.go b/src/cmd/link/internal/loadelf/ldelf.go index 6fc343295b..90505a2342 100644 --- a/src/cmd/link/internal/loadelf/ldelf.go +++ b/src/cmd/link/internal/loadelf/ldelf.go @@ -590,9 +590,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i elfobj.nsect = uint(elfobj.shnum) for i := 0; uint(i) < elfobj.nsect; i++ { - if f.Seek(int64(uint64(base)+elfobj.shoff+uint64(int64(i)*int64(elfobj.shentsize))), 0) < 0 { - return errorf("malformed elf file: negative seek") - } + f.MustSeek(int64(uint64(base)+elfobj.shoff+uint64(int64(i)*int64(elfobj.shentsize))), 0) sect := &elfobj.sect[i] if is64 != 0 { var b ElfSectBytes64 @@ -996,9 +994,7 @@ func elfmap(elfobj *ElfObj, sect *ElfSect) (err error) { } sect.base = make([]byte, sect.size) - if elfobj.f.Seek(int64(uint64(elfobj.base)+sect.off), 0) < 0 { - return fmt.Errorf("short read: seek not successful") - } + elfobj.f.MustSeek(int64(uint64(elfobj.base)+sect.off), 0) if _, err := io.ReadFull(elfobj.f, sect.base); err != nil { return fmt.Errorf("short read: %v", err) } diff --git a/src/cmd/link/internal/loadmacho/ldmacho.go b/src/cmd/link/internal/loadmacho/ldmacho.go index a8e41a94c7..c303752992 100644 --- a/src/cmd/link/internal/loadmacho/ldmacho.go +++ b/src/cmd/link/internal/loadmacho/ldmacho.go @@ -321,9 +321,7 @@ func macholoadrel(m *ldMachoObj, sect *ldMachoSect) int { rel := make([]ldMachoRel, sect.nreloc) n := int(sect.nreloc * 8) buf := make([]byte, n) - if m.f.Seek(m.base+int64(sect.reloff), 0) < 0 { - return -1 - } + m.f.MustSeek(m.base+int64(sect.reloff), 0) if _, err := io.ReadFull(m.f, buf); err != nil { return -1 } @@ -367,9 +365,7 @@ func macholoaddsym(m *ldMachoObj, d *ldMachoDysymtab) int { n := int(d.nindirectsyms) p := make([]byte, n*4) - if m.f.Seek(m.base+int64(d.indirectsymoff), 0) < 0 { - return -1 - } + m.f.MustSeek(m.base+int64(d.indirectsymoff), 0) if _, err := io.ReadFull(m.f, p); err != nil { return -1 } @@ -387,9 +383,7 @@ func macholoadsym(m *ldMachoObj, symtab *ldMachoSymtab) int { } strbuf := make([]byte, symtab.strsize) - if m.f.Seek(m.base+int64(symtab.stroff), 0) < 0 { - return -1 - } + m.f.MustSeek(m.base+int64(symtab.stroff), 0) if _, err := io.ReadFull(m.f, strbuf); err != nil { return -1 } @@ -400,9 +394,7 @@ func macholoadsym(m *ldMachoObj, symtab *ldMachoSymtab) int { } n := int(symtab.nsym * uint32(symsize)) symbuf := make([]byte, n) - if m.f.Seek(m.base+int64(symtab.symoff), 0) < 0 { - return -1 - } + m.f.MustSeek(m.base+int64(symtab.symoff), 0) if _, err := io.ReadFull(m.f, symbuf); err != nil { return -1 } @@ -463,7 +455,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i } if is64 { - f.Seek(4, 1) // skip reserved word in header + f.MustSeek(4, 1) // skip reserved word in header } m := &ldMachoObj{ @@ -555,9 +547,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i return errorf("load segment out of range") } - if f.Seek(m.base+int64(c.seg.fileoff), 0) < 0 { - return errorf("cannot load object data: seek failed") - } + f.MustSeek(m.base+int64(c.seg.fileoff), 0) dat := make([]byte, c.seg.filesz) if _, err := io.ReadFull(f, dat); err != nil { return errorf("cannot load object data: %v", err) diff --git a/src/cmd/link/internal/loadpe/ldpe.go b/src/cmd/link/internal/loadpe/ldpe.go index ac07d5c35d..f08e1241a7 100644 --- a/src/cmd/link/internal/loadpe/ldpe.go +++ b/src/cmd/link/internal/loadpe/ldpe.go @@ -133,7 +133,7 @@ const ( type peBiobuf bio.Reader func (f *peBiobuf) ReadAt(p []byte, off int64) (int, error) { - ret := ((*bio.Reader)(f)).Seek(off, 0) + ret := ((*bio.Reader)(f)).MustSeek(off, 0) if ret < 0 { return 0, errors.New("fail to seek") } diff --git a/src/cmd/link/internal/loadxcoff/ldxcoff.go b/src/cmd/link/internal/loadxcoff/ldxcoff.go index 7c863d79c5..f52b23ce6a 100644 --- a/src/cmd/link/internal/loadxcoff/ldxcoff.go +++ b/src/cmd/link/internal/loadxcoff/ldxcoff.go @@ -27,7 +27,7 @@ type ldSection struct { type xcoffBiobuf bio.Reader func (f *xcoffBiobuf) ReadAt(p []byte, off int64) (int, error) { - ret := ((*bio.Reader)(f)).Seek(off, 0) + ret := ((*bio.Reader)(f)).MustSeek(off, 0) if ret < 0 { return 0, errors.New("fail to seek") } diff --git a/src/cmd/link/internal/objfile/objfile.go b/src/cmd/link/internal/objfile/objfile.go index b650c12dbe..107409b00d 100644 --- a/src/cmd/link/internal/objfile/objfile.go +++ b/src/cmd/link/internal/objfile/objfile.go @@ -85,7 +85,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib *sym.Library, le start := f.Offset() roObject := f.SliceRO(uint64(length)) if roObject != nil { - f.Seek(int64(-length), os.SEEK_CUR) + f.MustSeek(int64(-length), os.SEEK_CUR) } r := &objReader{ rd: f, @@ -104,7 +104,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib *sym.Library, le if r.roOffset != length { log.Fatalf("%s: unexpected end at %d, want %d", pn, r.roOffset, start+length) } - r.rd.Seek(int64(length), os.SEEK_CUR) + r.rd.MustSeek(int64(length), os.SEEK_CUR) } else if f.Offset() != start+length { log.Fatalf("%s: unexpected end at %d, want %d", pn, f.Offset(), start+length) } diff --git a/src/cmd/vet/all/whitelist/all.txt b/src/cmd/vet/all/whitelist/all.txt index e12a96e0c5..cecd52b412 100644 --- a/src/cmd/vet/all/whitelist/all.txt +++ b/src/cmd/vet/all/whitelist/all.txt @@ -23,8 +23,6 @@ cmd/compile/internal/gc/testdata/short_test.go: unreachable code // These cases are basically ok. // Errors are handled reasonably and there's no clear need for interface satisfaction. // Except for the runtime/pprof case, the API is not exported. -cmd/internal/bio/buf.go: method Seek(offset int64, whence int) int64 should have signature Seek(int64, int) (int64, error) -cmd/internal/bio/buf.go: method Seek(offset int64, whence int) int64 should have signature Seek(int64, int) (int64, error) fmt/print.go: method WriteByte(c byte) should have signature WriteByte(byte) error // Also non-standard, but this method is on an unexported type, so it's