dvyukov/go-fuzz 3642
Randomized testing for Go
google/starlark-go 1068
Starlark in Go: the Starlark configuration language, implemented in Go
currantlabs/ble 175
Corpus for github.com/dvyukov/go-fuzz examples
josharian/2015-oscon-go-perf-tutorial 19
Slides and code for Go performance tutorial given at 2015 OSCON
Don't: template-based, decentralized static analysis for Go
automate Go compiler comparisons
Gather distribution information about select cases usage in Go (quick and dirty)
benchserve turns a test binary into a benchmark server
Package abif provides an ABIF file reader in Go
issue openedgolang/go
cmd/compile: optimize comparisons to min/max (u)ints by checking for overflow
package p
import "math"
func f(x int64) bool {
return x == math.MinInt64
}
On amd64, the core of this compiles to:
0x0005 00005 (z.go:6) MOVQ $-9223372036854775808, CX
0x000f 00015 (z.go:6) CMPQ AX, CX
0x0012 00018 (z.go:6) SETEQ "".~r1+16(SP)
It would be cheaper and smaller instead to decrement CX and check the flags for underflow. A similar trick can be used for checking min and max ints and uints of all sizes. It might also be useful in the division fix-up code, where we must check for min int divisor.
cc @randall77 @dr2chase @martisch @mundaym
created time in 16 hours
issue openedgolang/go
cmd/compile: missed opportunity to coalesce reads/writes
package p
import "encoding/binary"
func f(b []byte, x *[8]byte) {
_ = b[8]
t := binary.LittleEndian.Uint64(x[:])
binary.LittleEndian.PutUint64(b, t)
}
This should compile down to two MOVQs on amd64, one to load from x and one to write to b.
Instead, it compiles to a series of smaller MOVxs. The coalescing rules may need more cases added.
cc @randall77 @dr2chase @martisch
created time in 17 hours
issue openedgolang/go
cmd/compile: missed opportunity to inline runtime.memmove
package p
func f(b []byte, x *[8]byte) {
_ = b[8]
copy(b, x[:])
}
This should compile down to a pair of MOVQs, one to load from x and one to write to b. It doesn't; it still contains a call to runtime.memmove. From a quick glance at ssa.html, the problem is that the lowering of runtime.memmove to Move happens during generic.rules, but we haven't detected that the size of the memmove is a constant until after lowering.
To fix this, we could either improve the analysis in the generic stages or add arch-specific runtime.memmove-to-Move lowering.
cc @randall77 @dr2chase @martisch
created time in 17 hours
pull request commenttailscale/tailscale
WIP: tstime: add an abstract Time interface, which can be real or virtual.
I'm on the fence about this. I like the idea of having a more complete mockery of time, and I see its utility. But the existing implementation makes me a bit nervous, per the comment above.
I haven't done a full review of the code yet; I will do so (if appropriate) once conversation about monotonic time and cross-tstime.Time safety has settled.
comment created time in 3 days
Pull request review commenttailscale/tailscale
WIP: tstime: add an abstract Time interface, which can be real or virtual.
package tstime import (- "errors"- "fmt"- "strings"- "sync"+ "context"+ "math/bits"+ "sync/atomic" "time" ) -// zoneOf returns the RFC3339 zone suffix (either "Z" or like-// "+08:30"), or the empty string if it's invalid or not something we-// want to cache.-func zoneOf(s string) string {- if strings.HasSuffix(s, "Z") {- return "Z"- }- if len(s) < len("2020-04-05T15:56:00+08:00") {- // Too short, invalid? Let time.Parse fail on it.- return ""- }- zone := s[len(s)-len("+08:00"):]- if c := zone[0]; c == '+' || c == '-' {- min := zone[len("+08:"):]- switch min {- case "00", "15", "30":- return zone- }- }- return ""+// Time is an interface to all things that deal with the current time,+// and the passage of time. It's meant to be used as a replacement for+// the functions of the same name in the `time` and `context`+// packages, so that different implementations of time can be swapped+// in.+type Time interface {+ // After is like time.After.+ After(time.Duration) <-chan time.Time+ // Sleep is like time.Sleep.+ Sleep(time.Duration)++ // Since is like time.Since.+ Since(time.Time) time.Duration+ // Until is like time.Until.+ Until(time.Time) time.Duration++ // Now is like time.Now.+ Now() time.Time++ // AfterFunc is like time.AfterFunc.+ AfterFunc(time.Duration, func()) *Timer+ // NewTimer is like time.NewTimer.+ NewTimer(time.Duration) *Timer+ // NewTicker is like time.NewTicker.+ NewTicker(time.Duration) *time.Ticker++ // WithTimeout is like context.WithTimeout.+ ContextWithTimeout(context.Context, time.Duration) (context.Context, context.CancelFunc)+ // WithDeadline is like context.WithDeadline.+ ContextWithDeadline(context.Context, time.Time) (context.Context, context.CancelFunc) } -// locCache maps from zone offset suffix string ("+08:00") =>-// *time.Location (from FixedLocation).-var locCache sync.Map+// Timer wraps a time.Timer and makes its Reset function integrate+// with a custom Time implementation, rather than hardcode stdlib's.+type Timer struct {+ timer *time.Timer+ adjust func(time.Duration) time.Duration+} -func getLocation(zone, timeValue string) (*time.Location, error) {- if zone == "Z" {- return time.UTC, nil- }- if loci, ok := locCache.Load(zone); ok {- return loci.(*time.Location), nil- }- // TODO(bradfitz): just parse it and call time.FixedLocation.- // For now, just have time.Parse do it once:- t, err := time.Parse(time.RFC3339Nano, timeValue)- if err != nil {- return nil, err- }- loc := t.Location()- locCache.LoadOrStore(zone, loc)- return loc, nil+func (t *Timer) Reset(d time.Duration) bool {+ return t.timer.Reset(t.adjust(d))+} +func (t *Timer) Stop() bool {+ return t.timer.Stop() } -// Parse3339 is a wrapper around time.Parse(time.RFC3339Nano, s) that caches-// timezone Locations for future parses.-func Parse3339(s string) (time.Time, error) {- zone := zoneOf(s)- if zone == "" {- // Invalid or weird timezone offset. Use slow path,- // which'll probably return an error.- return time.Parse(time.RFC3339Nano, s)- }- loc, err := getLocation(zone, s)- if err != nil {- return time.Time{}, err- }- s = s[:len(s)-len(zone)] // remove zone suffix- var year, mon, day, hr, min, sec, nsec int- const baseLen = len("2020-04-05T15:56:00")- if len(s) < baseLen ||- !parseInt(s[:4], &year) ||- s[4] != '-' ||- !parseInt(s[5:7], &mon) ||- s[7] != '-' ||- !parseInt(s[8:10], &day) ||- s[10] != 'T' ||- !parseInt(s[11:13], &hr) ||- s[13] != ':' ||- !parseInt(s[14:16], &min) ||- s[16] != ':' ||- !parseInt(s[17:19], &sec) {- return time.Time{}, errors.New("invalid time")+// Std is a Time implementation that uses standard library+// functions. With this implementation, time works as you'd normally+// expect.+type Std struct{}++// After is like time.After.+func (Std) After(d time.Duration) <-chan time.Time { return time.After(d) }++// After is like time.Sleep.+func (Std) Sleep(d time.Duration) { time.Sleep(d) }++// After is like time.Since.+func (Std) Since(t time.Time) time.Duration { return time.Since(t) }++// After is like time.Until.+func (Std) Until(t time.Time) time.Duration { return time.Until(t) }++// After is like time.NewTicker.+func (Std) NewTicker(d time.Duration) *time.Ticker { return time.NewTicker(d) }++// After is like time.Now.+func (Std) Now() time.Time { return time.Now() }+func durationIdentity(d time.Duration) time.Duration { return d }++// After is like time.AfterFunc.+func (s Std) AfterFunc(d time.Duration, f func()) *Timer {+ return &Timer{time.AfterFunc(d, f), durationIdentity}+}++// After is like time.NewTimer.+func (s Std) NewTimer(d time.Duration) *Timer { return &Timer{time.NewTimer(d), durationIdentity} }++// ContextWithTimeout is like context.WithTimeout.+func (Std) ContextWithTimeout(ctx context.Context, d time.Duration) (context.Context, context.CancelFunc) {+ return context.WithTimeout(ctx, d)+}++// ContextWithDeadline is like context.WithDeadline.+func (Std) ContextWithDeadline(ctx context.Context, t time.Time) (context.Context, context.CancelFunc) {+ return context.WithDeadline(ctx, t)+}++// Virtual is a Time implementation that runs faster or slower than+// wall clock time, but keeps ratios the same.+type Virtual struct {+ // Second is how long a virtual second actually takes in wall+ // clock time. That is, if you virtual.Sleep(time.Second), this is+ // how long you'll actually sleep.+ Second time.Duration++ // first is the first value of time.Now seen by this virtual+ // instance. It's used as the origin point for virtual time.Time+ // values when scaling them to/from wall clock time.+ first int64 // nanoseconds since Epoch, accessed atomically.+}++func (vt *Virtual) init() {+ atomic.CompareAndSwapInt64(&vt.first, 0, time.Now().UnixNano())+}++// mulDiv implements v*mul/div using 128-bit integer math, to avoid+// overflows and losses of precision.+func mulDiv(v, mul, div time.Duration) time.Duration {+ neg := v < 0+ if neg {+ v = -v }- nsStr := s[baseLen:]- if nsStr != "" {- if nsStr[0] != '.' {- return time.Time{}, errors.New("invalid optional nanosecond prefix")- }- if !parseInt(nsStr[1:], &nsec) {- return time.Time{}, fmt.Errorf("invalid optional nanosecond number %q", nsStr[1:])- }- for i := 0; i < len("999999999")-(len(nsStr)-1); i++ {- nsec *= 10- }++ hi, lo := bits.Mul64(uint64(v), uint64(mul))+ quo, _ := bits.Div64(hi, lo, uint64(div))++ ret := time.Duration(quo)+ if neg {+ ret = -ret }- return time.Date(year, time.Month(mon), day, hr, min, sec, nsec, loc), nil+ return ret+}++// virtualToWallDuration converts a time.Duration from the virtual+// reference frame to the wall clock reference frame. This is the+// transform that takes place to convert+// virtual.Sleep(virtualDuration) into time.Sleep(realDuration), for+// example.+func (vt *Virtual) virtualToWallDuration(d time.Duration) time.Duration {+ return mulDiv(d, vt.Second, time.Second)+}++// wallToVirtualDuration converts a time.Duration from the wall clock+// reference frame to the virtual reference frame.+func (vt *Virtual) wallToVirtualDuration(d time.Duration) time.Duration {+ return mulDiv(d, time.Second, vt.Second)+}++func (vt *Virtual) virtualToWallTime(t time.Time) time.Time {+ vt.init()+ wt := time.Unix(0, atomic.LoadInt64(&vt.first)).In(t.Location())+ return wt.Add(vt.virtualToWallDuration(t.Sub(wt)))+}+func (vt *Virtual) wallToVirtualTime(t time.Time) time.Time {+ vt.init()+ ret := time.Unix(0, atomic.LoadInt64(&vt.first)).In(t.Location())+ return ret.Add(vt.wallToVirtualDuration(t.Sub(ret)))+}++// After is like time.After.+func (vt *Virtual) After(d time.Duration) <-chan time.Time {+ return time.After(vt.virtualToWallDuration(d))+}++// Sleep is like time.Sleep.+func (vt *Virtual) Sleep(d time.Duration) {+ time.Sleep(vt.virtualToWallDuration(d))+}++// Since is like time.Since.+func (vt *Virtual) Since(t time.Time) time.Duration {+ return vt.wallToVirtualDuration(time.Since(vt.virtualToWallTime(t)))
virtualToWallTime breaks monotonic time support (see https://go.googlesource.com/proposal/+/master/design/12914-monotonic.md), so this version of time.Since will behave differently in the fact of machine time changes. Maybe that's ok if it's intended for tests, but it could cause mysterious test flakes.
I haven't worked it all the way through, but I believe that you could work around this with even more wrapping. You could rename your Time interface to just T, and then instead of having this package accept/return time.Times, you could have them accept/return type Time interfaces. Clock times are unchanged (modulo being wrapped), but Virtual methods return virtual times, which are a struct containing the virtual time and the clock. You'd need to modify yourTinterface methods to deal intstime.Timeinstead oftime.Time`, and your Std implementation accordingly.
Then the implementation of this function looks like:
if u, ok := t.(*virtualTime); !ok {
panic("cannot mix and match different tstime.T")
}
return vt.wallToVirtualDuration(time.Since(u.Clock))
The panic in this function is another sign that the existing implementation is a little bit dangerous: Mixing time.Times between different tstime.Times will cause silent weird results, not failures.
comment created time in 3 days
issue commenttailscale/tailscale
Multiple "tailscale up" can deadlock tailscaled
Manual inspection of the stack trace was not enlightening. Given all that, I'm adjusting to L1. We can reprioritize if it ever happens again.
comment created time in 3 days
issue commentdvyukov/go-fuzz
"go-fuzz-build" leads to "misplaced compiler directive"
It’s a bug in go-fuzz. But we are already tracking the bug in #294 , so I’m going to close this issue. Let’s continue discussion in #294.
comment created time in 4 days
issue commenttailscale/tailscale
Multiple "tailscale up" can deadlock tailscaled
Did this happen once or repeatably? I have been unable to reproduce locally running 8 tailscale up processes concurrently in a loop.
comment created time in 4 days
push eventtailscale/tailscale
commit sha f0ef5610499ceffa890523ec34df5f0cf9891120
wgengine/tsdns: use netns to obtain a socket Fixes #789 Signed-off-by: Josh Bleecher Snyder <[email protected]>
push time in 4 days
issue closedtailscale/tailscale
wgengine/tsdns: forwarding should use net/netns to open sockets
This will prevent accidental routing loops.
I'd like to wait for #788 to be merged (or another path selected) before working on this, to avoid merge conflicts.
closed time in 4 days
josharianPR merged tailscale/tailscale
<!-- Reviewable:start --> This change is <img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/> <!-- Reviewable:end -->
pr closed time in 4 days
push eventtailscale/tailscale
commit sha 6e8328cba5489c35a01ea0ad87cf52f9843cc03c
wgengine/tsdns: replace connections when net link changes (macOS) When the network link changes, existing UDP sockets fail immediately and permanently on macOS. The forwarder set up a single UDP conn and never changed it. As a result, any time there was a network link change, all forwarded DNS queries failed. To fix this, create a new connection when send requests fail because of network unreachability. This change is darwin-only, although extended it to other platforms should be straightforward. Signed-off-by: Josh Bleecher Snyder <[email protected]>
push time in 4 days
PR merged tailscale/tailscale
See individual commit message for details.
Tested manually on macOS. If we're happy with this direction, we can expand to other platforms.
<!-- Reviewable:start -->
This change is <img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/> <!-- Reviewable:end -->
pr closed time in 4 days
pull request commenttailscale/tailscale
wgengine/tsdns: replace connections when net link changes (macOS)
Oh n/m, easy to miss the approval. No need to take another look. :)
comment created time in 4 days
pull request commenttailscale/tailscale
wgengine/tsdns: replace connections when net link changes (macOS)
All done, thanks. PTAL.
comment created time in 4 days
push eventtailscale/tailscale
commit sha 1fd10061fdfba0062a1754470151524e2b9c3a45
wgengine/tsdns: delegate bonjour service rdns requests While we're here, parseQuery into a plain function. This is helpful for fuzzing. (Which I did a bit of. Didn't find anything.) And clean up a few minor things. Signed-off-by: Josh Bleecher Snyder <[email protected]>
commit sha 5247e9936021819b5ab3d9d5efdb1e3f83c2e29f
wgengine/tsdns: replace connections when net link changes (macOS) When the network link changes, existing UDP sockets fail immediately and permanently on macOS. The forwarder set up a single UDP conn and never changed it. As a result, any time there was a network link change, all forwarded DNS queries failed. To fix this, create a new connection when send requests fail because of network unreachability. This change is darwin-only, although extended it to other platforms should be straightforward. Signed-off-by: Josh Bleecher Snyder <[email protected]>
push time in 4 days
Pull request review commenttailscale/tailscale
wgengine/tsdns: replace connections when net link changes (macOS)
func (f *forwarder) forward(query Packet) error { return nil }++// A fwdconn manages a single connection used to forward DNS requests.+// Net link changes can cause a *net.UDPConn to become permanently unusable, particularly on macOS.+// fwdconn detects such situations and transparently creates new connections.+type fwdconn struct {+ // logf allows a fwdconn to log+ logf logger.Logf++ // wg tracks the number of outstanding conn.Read and conn.Write calls+ wg sync.WaitGroup+ // change allows calls to read to block until a the network connection has been replaced+ change *sync.Cond++ // mu protects fields that follow it; it is is also change's Locker+ mu sync.Mutex++ // closed tracks whether fwdconn has been permanently closed+ closed bool++ // conn is the current active connection+ conn *net.UDPConn+}++func newFwdConn(logf logger.Logf, idx int) *fwdconn {+ c := new(fwdconn)+ c.logf = logger.WithPrefix(logf, fmt.Sprintf("fwdconn %d: ", idx))+ c.change = sync.NewCond(&c.mu)+ // c.conn is created lazily in send+ return c+}++// send sends packet to dst using fwdconn's connection.+// It is best effort. It is UDP, after all. Failures are logged.+func (c *fwdconn) send(packet []byte, dst net.Addr) {+ b := backoff.NewBackoff("tsdns-fwdconn-send", c.logf, 30*time.Second)
It doesn't move the benchmarks, but since it's done now, I'll leave it in place.
comment created time in 4 days
Pull request review commenttailscale/tailscale
wgengine/tsdns: replace connections when net link changes (macOS)
+// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved.+// Use of this source code is governed by a BSD-style+// license that can be found in the LICENSE file.++package tsdns++import (+ "errors"+ "syscall"+)++func isSyscallErrno(err error, errno syscall.Errno) bool {+ var n syscall.Errno+ if !errors.As(err, &n) {+ return false+ }+ return n == errno+}++func networkIsDown(err error) bool {+ return isSyscallErrno(err, syscall.ENETDOWN)
Nice, thanks.
comment created time in 4 days
issue openedtailscale/tailscale
wgengine/tsdns: forwarding should use net/netns to open sockets
This will prevent accidental routing loops.
I'd like to wait for #788 to be merged (or another path selected) before working on this, to avoid merge conflicts.
created time in 4 days
push eventtailscale/tailscale
commit sha 1fd10061fdfba0062a1754470151524e2b9c3a45
wgengine/tsdns: delegate bonjour service rdns requests While we're here, parseQuery into a plain function. This is helpful for fuzzing. (Which I did a bit of. Didn't find anything.) And clean up a few minor things. Signed-off-by: Josh Bleecher Snyder <[email protected]>
push time in 4 days
PR merged tailscale/tailscale
Noticed while debugging something else.
<!-- Reviewable:start -->
This change is <img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/> <!-- Reviewable:end -->
pr closed time in 4 days
pull request commenttailscale/tailscale
wgengine/tsdns: handle bonjour service prefixes in rdns names
Submitting. Holler if you desire changes post-facto.
comment created time in 4 days
PR opened tailscale/tailscale
See individual commit message for details.
Tested manually on macOS. If we're happy with this direction, we can expand to other platforms.
pr created time in 4 days
push eventtailscale/tailscale
commit sha 051d966537cc28c5b45a24165fc46deac20b943e
wgengine/tsdns: replace connections when net link changes (macOS) When the network link changes, existing UDP sockets fail immediately and permanently on macOS. The forwarder set up a single UDP conn and never changed it. As a result, any time there was a network link change, all forwarded DNS queries failed. To fix this, create a new connection when send requests fail because of network unreachability. This change is darwin-only, although extended it to other platforms should be straightforward. Signed-off-by: Josh Bleecher Snyder <[email protected]>
push time in 4 days
push eventtailscale/tailscale
commit sha b7e0ff598ad72fa6c48afa0beeae211aad60164f
wgengine: don't close tundev in NewUserspaceEngine. newUserspaceEngineAdvanced closes the tun device on error already. Fixes #783. Signed-off-by: David Anderson <[email protected]>
commit sha 7c11f71ac53f83c813859a9cae3ae7bf8a273bcb
wgengine/router: ignore errors deleting 169.254.255.255/32 route on Windows Updates #785
commit sha 2d0ed9967288770ba92d2ff3a5d0c44cbd9bf0e1
wgengine, wgengine/router: add a bunch of (temporary?) engine creation logging Trying to debug what's slow on a user's machine. Updates #785
commit sha 167c808671ed3cd674dc03664e40ccb573d585b8
wgengine/tsdns: replace connections when net link changes (macOS) When the network link changes, existing UDP sockets fail immediately and permanently on macOS. The forwarder set up a single UDP conn and never changed it. As a result, any time there was a network link change, all forwarded DNS queries failed. To fix this, create a new connection when send requests fail because of network unreachability. This change is darwin-only, although extended it to other platforms should be straightforward. Signed-off-by: Josh Bleecher Snyder <[email protected]>
push time in 4 days
push eventjosharian/pct
commit sha 0a85e0cdde87788fe1627d3d2d8ab42b801c66d4
go.mod: only require Go 1.14 1.16 isn't even out yet. :P
push time in 4 days
push eventjosharian/pct
commit sha a07db6a7da5c307ffa3569b79c6a62aff08dfb95
add go.mod file
push time in 4 days
pull request commentjosharian/pct
Thanks, Rog. It should probably require Go 1.14 (or Go 1.5!) instead of Go 1.16, but I'll fix that after merge.
I also need to s/master/main/. Someday.
comment created time in 4 days
Pull request review commenttailscale/tailscale
wgengine/tsdns: handle bonjour service prefixes in rdns names
func (f *forwarder) Start() error { } f.wg.Add(connCount + 1)- for idx, conn := range f.conns {- go f.recv(uint16(idx), conn)+ for idx := range f.conns {+ idx := idx
Sigh. Yes, thanks. I just misread.
comment created time in 5 days
push eventtailscale/tailscale
push time in 5 days
pull request commenttailscale/tailscale
wgengine/tsdns: handle bonjour service prefixes in rdns names
Also added in a quick bug fix. PTAL.
comment created time in 5 days
push eventtailscale/tailscale
commit sha b48daf65674efab0cf6d86f27bfecfbe850e7ab8
wgengine/tsdns: delegate bonjour service rdns requests While we're here, parseQuery into a plain function. This is helpful for fuzzing. (Which I did a bit of. Didn't find anything.) And clean up a few minor things. Signed-off-by: Josh Bleecher Snyder <[email protected]>
commit sha 39ad71eb5e7a15aeb59dd459efb1854ac4a59f78
wgengine/tsdns: fix race condition in forwarder.Start Closing over a loop iteration variable is a classic Go bug. There are going to be a bunch of other changes to this code, but may as well make this standalone bug fix for clarity. Signed-off-by: Josh Bleecher Snyder <[email protected]>
push time in 5 days
push eventtailscale/tailscale
commit sha aebd1a331024478f39a37b178a995a7d817bfe54
wgengine/tsdns: delegate bonjour service rdns requests While we're here, parseQuery into a plain function. This is helpful for fuzzing. (Which I did a bit of. Didn't find anything.) And clean up a few minor things. Signed-off-by: Josh Bleecher Snyder <[email protected]>
push time in 5 days
pull request commenttailscale/tailscale
wgengine/tsdns: handle bonjour service prefixes in rdns names
Ah, I see now. I'll change this to just remove the logging noise, then.
comment created time in 5 days
pull request commenttailscale/tailscale
wgengine/tsdns: handle bonjour service prefixes in rdns names
I could easily be missing a lot of context here...but if we know the answer, why wouldn't we respond to a Bonjour request? Any reason Bonjour shouldn't work over Tailscale?
comment created time in 5 days
PR opened tailscale/tailscale
Noticed while debugging something else.
pr created time in 5 days
push eventtailscale/tailscale
commit sha 4cc0ed67f9c49091bdc3c6396886e27dd461e958
tailcfg: add MachineKey.IsZero Signed-off-by: Josh Bleecher Snyder <[email protected]>
push time in 7 days
issue commentpion/webrtc
I’m no longer using pion; I’m happy to let you decide about the best path forward for this issue.
comment created time in 12 days
issue commentgolang/go
cmd/compile: mid-stack inline dispatch functions that call a function on each path
My Go time is severely restricted at the moment, but I really look forward to trying this out. And reverting my math/big hacks.
comment created time in 12 days
issue commentdvyukov/go-fuzz
Bad atomic field offset on i386
Thanks! Fix forthcoming...
comment created time in 13 days
push eventjosharian/go-fuzz
commit sha e3eb428511720f87ce75d11e2450fe82b44ccc5b
go-fuzz-build: load reflect when using libfuzzer libfuzzer's generated main function uses package reflect. When attempting to build a package that doesn't depend on reflect, such as github.com/dvyukuv/go-fuzz-corpus/{bzip2,gif,url}, package reflect wasn't getting copied to GOROOT, and the build failed. Fix that. We may need something similar in the future for fuzz.F; see #223. Updates google/oss-fuzz/#2188
commit sha 5cc3605ccbb6e38722b388400463114cc3ef29f5
go-fuzz-build: use -trimpath flag when available Go 1.13 has a new -trimpath flag to cmd/go. It removes all path prefixes (GOROOT, GOPATH). This will yield nicer panic tracebacks, without the go-fuzz-build temp directories. It will also allow go-fuzz-build to use the cmd/go cache. It doesn't have a dramatic impact on build times, but every little bit helps. Note that upstream cache support for -trimpath is mildly broken, but it will be fixed by the time Go 1.13 is released, and in the meantime, adding -trimpath support to go-fuzz doesn't hurt.
commit sha 134cf682d3493813fe98108faf2a31759fa0764e
Update location of examples
commit sha f37f81c5d15aaa6c906e962f3f50bed1ccc48471
Update README.md Add links to continuous fuzzing services. Move "History rewrite" closer to the bottom (hopefully this is not interesting for most users today).
commit sha f6654ea54e55961a6cf227340e95ffd24d35fa58
go-fuzz-dep: set input capacity to len The input capacity was always set MaxInputSize (1MB). This means that go-fuzz could miss whole lot of out-of-bounds bugs related to slicing, since slicing operations look at capacity. E.g. calculating indices of a field in the input and then extracting the field with slicing. Somehow we missed this for all this time. Found thanks to libfuzzer mode that does this properly and fuzzit.dev that uses the libfuzzer mode.
commit sha 193030f1cb162cbb89749cb7d14e7e7defac63c0
Update README.md
commit sha 98cec4f7504559d49c40130911aeb137db966234
Add 2 more examples of found bugs
commit sha 4d6aa5bf4d29bf896e3fa4eabca3c1dc6a4fd6ec
go-fuzz: fix integer divide by zero
commit sha 1123d3b1be967487900f7ecf92fc30889650545c
go-build-fuzz: add -x flag
commit sha 1810d380ab9c2786af00db592f86d83063216ed0
go-fuzz: add retrying to connect to coordinator
commit sha 6db5890afbd34304856de2b72c96fe4aa60e5c4d
go-fuzz-build: add -preserve flag The -preserve flag allows people to opt out of having particular packages instrumented, either to work around issues or to reduce coverage noise from uninteresting, large packages early in the critical path. Fixes #266
commit sha 532ac05586a18c759fde1ca66a457911d9f42fe4
go-fuzz-build: improve error when trying to fuzz package main Package main is not importable, and go-fuzz-build requires that we be able to import the package in question, in order to be able to call the Fuzz function. The existing error message did contain the relevant information, but it was buried amidst a bunch of other noise. Make it clearer. Error message before: failed to execute go build: exit status 1 /var/folders/1t/n61cbvls5bl293bbb0zyypqw0000gn/T/go-fuzz-build699217618/gopath/src/github.com/dvyukov/go-fuzz-corpus/cmd/go.fuzz.main/main.go:5:2: import "github.com/dvyukov/go-fuzz-corpus/cmd" is a program, not an importable package Error message after: cannot fuzz package main
commit sha 3901820d0d7219cef278724014898cd009058f88
Add 5 more examples of found bugs
commit sha 7002bfe060a6e036346536bbb5e1256609330146
Add opt-in go-fuzz modules support
commit sha fdaa9b19a67dfb373a320aff9b35148182da99e6
trophies: github.com/google/go-attestation
commit sha a9511467ab5995dac8ba1b3c685b488ce73e9aef
trophies: github.com/buger/jsonparser
commit sha 8cb20381268133974b070fff8f404435b3d189c1
preliminary Go modules support (#274) * preliminary Go modules support (#2) #### Summary The heart of the change is very small -- we stop overwriting the user's value for the `GO111MODULE` env var in two places. This means we end up respecting whatever the user has set for `GO111MODULE`, and relying on `cmd/go` to interpret the meaning of an unset `GO111MODULE` (which defaults to `auto` for Go 1.11-1.13, and likely will default to `on` at some point during Go 1.14 development). In addition, there are some comments added, as well as an explicit check for `GOFLAGS=-mod=vendor`, which is not supported. The tests exercises 'replace' directives, v2+ modules, GO111MODULE set to on|off|auto, running inside GOPATH, running outside GOPATH, the mechanisms by which go-fuzz/go-fuzz-dep is found, as well as vendoring (which is not supported, but it tests that a sensible error is emitted). #### Additional Details Historically, go-fuzz has set up a clean GOPATH environment in a temp directory, instrumented the code for fuzzing coverage, and built the instrumented code in the temp directory. The current approach is to keep doing that (and not set up a full-blown modules-based environment for building), but use modules to find the code to instrument. v2+ modules are potentially problematic due to Semantic Import Versioning (with the major version in the import path). However, it turns out to not be too bad to handle it. For a v2+ module created following the 'major branch' approach, the /vN is materialized into a physical directory. For example, the github.com/russross/blackfriday/v2 module ends up in the /tmp/blah/gopath/src/github.com/russross/blackfriday/v2 directory. This should be a valid layout, and people use this layout today (including when manually switching to a 'major subdirectory' approach for a v2+ module, which involves creating a /v2 or /vN directory so that pre-modules toolchains follow a /v2 or /vN import path and find an on-disk layout that they expect without any knowledge of modules). The approach does not copy go.mod files at all. (Before starting, I was thinking I would need to copy go.mod files to trigger "minimal module awareness", which is a transitional mechanism within cmd/go, but after some experimentation / thinking, I concluded it was not needed based on materializing the /v2). For tests, I am using the script-driven test facility that the core Go team created for testing cmd/go, which is well tuned to testing the various permutations of modules, including it lets you relatively easily set up go.mod files and source files, run commands and check results. (Some more details of the capability here: https://github.com/golang/go/blob/master/src/cmd/go/testdata/script/README). * modules support: adjust wording based on first-pass review, and update vendor test (#3) * travis: attempt to install cmd/testscript * testing: initial check of 'go-fuzz-build -h' output to see if any testscripts work * testing: change name of first test script * travis: check if the 'testscript' cmd seems to function at all. * testing: use the exec command to invoke 'go-fuzz-build -h' * testing: create initially failing test case for v2 modules * travis: run testscript for v2 modules * testing: remember to use 'exec' to invoke go-fuzz-build * testing: adjust comments in v2 module testscript * go-fuzz-build: preliminary module support * testing: flip from an expected failure to an expected pass for a module test * go-fuzz-build: update comments for preliminary modules support * go-fuzz: preliminary modules support for go-fuzz itself * travis: go-fuzz-defs sanity check * travis: additional temp sanity check * travis: add more comments, some additional sanity checks in case we need to debug in future * travis: s/go-fuzz-deps/go-fuzz-dep/ * testing: validate behavior of v2 modules * testing: renamed fuzz_help.txt * testing: update travis to use the renamed testscripts * travis: conditionally set GO111MODULE=auto, and test Go 1.13 rather than 1.11 * testing: validate modules outside GOPATH * testing: validate modules inside GOPATH * testing: invoke timeout properly * testing: preliminary test for vendored modules (not yet supported) * testing: validate how go-fuzz-dep and go-fuzz-defs are found * travis: run the latest testscripts for modules testing * testing: fix typo in mod_outside_gopath.txt file name * travis: fix typo in file name * go-fuzz-build: detect -mod=vendor * testing: validate we get a proper error for -mod=vendor * readme: describe preliminary modules support * readme: correct typo in modules support * readme: adjust modules support section * readme: tweak wording based on PR review * go-fuzz: tweak comment wording by removing "preliminary modules support" * go-fuzz-build: tweak comment wording by removing "preliminary modules support" * mod_vendor.txt: avoid triggering Go 1.14 auto detection of a vendor directory * readme: update wording based on review * readme: remove a blank line to re-trigger travis
commit sha a378175e205cefb8ea839b9db53de2e86f061e4d
Added two found and fixed bugs to trophies.
commit sha be3528f3a81351d8a438aed216130e1e7da39f7c
.travis.yml: fix osx setup There seems to be some change in osx machine setup on travis.
commit sha 2dc2d88eb660c60dd6e94689bf287a7f9311ed3f
Add trophy to README Add a new entry to the list of trophies for an off-by-one(?) issue I found in gofuzz [1], another fuzzing package for go that does purely random fuzzing. -- 1. https://github.com/google/gofuzz
push time in 13 days
push eventtailscale/tailscale
commit sha 7f97cf654dd128cdd8d826f9eee1aedb60a707b4
cmd/microproxy: add -insecure flag This makes it easier to run microproxy locally during development. Signed-off-by: Josh Bleecher Snyder <[email protected]>
push time in 13 days
PR merged tailscale/tailscale
This makes it easier to run microproxy locally during development.
<!-- Reviewable:start -->
This change is <img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/> <!-- Reviewable:end -->
pr closed time in 13 days
pull request commenttailscale/tailscale
cmd/microproxy: add -insecure flag
Remind me why some random production workaround(?) temporary(?) binary is in the open source tailscale/tailscale repo? Do we imagine anybody else ever needing this?
I wondered the same thing. Unless you say otherwise, @danderson, I'll move to corp later this week.
comment created time in 13 days
push eventtailscale/tailscale
commit sha b38ab5092013e313ebcf97b221b282081d0fe2e5
cmd/microproxy: add -insecure flag This makes it easier to run microproxy locally during development. Signed-off-by: Josh Bleecher Snyder <[email protected]>
push time in 13 days
PR opened tailscale/tailscale
This makes it easier to run microproxy locally during development.
pr created time in 13 days
push eventtailscale/tailscale
commit sha 3fa863e6d94cc61619e117c9ec073818d802b2ed
cmd/derper: add missing html.EscapeString calls in /debug page Signed-off-by: Josh Bleecher Snyder <[email protected]>
push time in 13 days
PR merged tailscale/tailscale
<!-- Reviewable:start --> This change is <img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/> <!-- Reviewable:end -->
pr closed time in 13 days
push eventtailscale/tailscale
commit sha 07a3c599c728d98161aae00f6933f5e7d8920936
cmd/derper: add missing html.EscapeString calls in /debug page Signed-off-by: Josh Bleecher Snyder <[email protected]>
push time in 13 days
issue commentgolang/go
math/big: different subVV result on pure Go vs assembly implementations
I believe that the length checks in the Go code are there to prevent bounds checks in the loop; removing them will make things worse. (Feel free to double-check, though.)
More docs and comments around this would be welcome, to avoid future confusion, if you are so inclined.
comment created time in 13 days
issue closedgolang/go
cmd/go: get downloads main~1 commit, not main
Reproduce:
Create a new repo and go mod init. Run go get -v -u github.com/tailscale/depaware. Then cat go.mod.
Result:
require github.com/tailscale/depaware v0.0.0-20200914201916-3f1070fd0d55 // indirect
Expected:
require github.com/tailscale/depaware v0.0.0-20200914232109-e09ee10c1824 // indirect
Note that you can force upgrade by go get -u github.com/tailscale/depaware@e09ee10c1824.
3f1070fd0d55 is HEAD~1; e09ee10c1824 is HEAD. go get should thus pick e09ee10c1824.
cc @jayconrod @bcmills
cc @danderson
closed time in 13 days
josharianissue commentgolang/go
cmd/go: get downloads main~1 commit, not main
Yep, it was the cache. :/ Closing as a duplicate.
comment created time in 13 days
issue commentgolang/go
math/big: different subVV result on pure Go vs assembly implementations
Does this result in any observable changes when using only the public API? IIRC it is the responsibility of the caller to ensure that the lengths are equal. It is possible we should document that more clearly.
I would love to delete the assembly, but the performance of the Go code is not good enough yet to do that. I got it closer a cycle or two ago, but there's a ways to go.
comment created time in 13 days
issue openedgolang/go
cmd/go: get downloads main~1 commit, not main
Reproduce:
Create a new repo and go mod init. Run go get -v -u github.com/tailscale/depaware. Then cat go.mod.
Result:
require github.com/tailscale/depaware v0.0.0-20200914201916-3f1070fd0d55 // indirect
Expected:
require github.com/tailscale/depaware v0.0.0-20200914232109-e09ee10c1824 // indirect
Note that you can force upgrade by go get -u github.com/tailscale/depaware@e09ee10c1824.
3f1070fd0d55 is HEAD~1; e09ee10c1824 is HEAD. go get should thus pick e09ee10c1824.
cc @jayconrod @bcmills
cc @danderson
created time in 14 days
pull request commenttailscale/tailscale
net/netns: add windows support.
If you rebase and push again, you should get a better depaware error. (If you get one at all. :) )
comment created time in 14 days
push eventtailscale/tailscale
commit sha 3f4d93feb2272c011fb1531e72a8726ea33b3459
go.mod: bump depaware to get diffs out of -check, again I had to use go get -u github.com/tailscale/depaware@e09ee10c18249e4bf198e66bbd47babcd502637a to force it to the correct version; it kept selecting head~1. Maybe because the branch is called main instead of master? Maybe because of some delay?
push time in 14 days
pull request commenttailscale/tailscale
net/netns: add windows support.
What's wrong with depaware is apparently there's a serious lag before go get -u gets you the latest version pushed to GitHub. My previous go get -u upgraded to an old version. Working on fixing now, but waiting for the latest to really be the latest...
comment created time in 14 days
push eventtailscale/depaware
commit sha e09ee10c18249e4bf198e66bbd47babcd502637a
Fix grammar in error message The list ... is ... not The list ... are ...
push time in 14 days
pull request commenttailscale/tailscale
net/netns: add windows support.
CI is using the wrong depaware version: go: downloading github.com/tailscale/depaware v0.0.0-20200910145248-cb751026f10d. I don't see why.
comment created time in 14 days
pull request commenttailscale/tailscale
net/netns: add windows support.
Try rebasing? I pushed a change that should provide more info on depaware failures: https://github.com/tailscale/tailscale/commit/41f6c78c5315dbea56b44de684e9664640fb17f9
comment created time in 14 days
issue commenttailscale/depaware
use "<multiple packages>" instead of "samplepkg+" when imported multiple times
For the diff in #3, 6 of the changes were new dependencies, 2 were new indirect dependencies, and 6 were lexicographic changes. That's not a great ratio.
A fancier alternative is to have depaware parse the existing depaware.txt file and attempt to preserve the existing lines if possible.
comment created time in 14 days
push eventtailscale/tailscale
commit sha 6e38d2948589df598a7f1f58e013f5eca2103260
wgengine/magicsock: improve test logging output This fixes line numbers and reduces timestamp precision to overwhelming the output. Signed-off-by: Josh Bleecher Snyder <[email protected]>
commit sha 0c0239242c381ffb84b2211756faffa173c8c25a
wgengine/magicsock: make discoPingPurpose a stringer It was useful for debugging once, it'll probably be useful again. Signed-off-by: Josh Bleecher Snyder <[email protected]>
commit sha a5d701095b8812837bc4df9d4cad0b5b3884774e
wgengine/magicsock: increase test timeout to reduce flakiness Updates #654. See that issue for a discussion of why this timeout reduces flakiness, and what next steps are. Signed-off-by: Josh Bleecher Snyder <[email protected]>
push time in 14 days
PR merged tailscale/tailscale
...and assorted debugging improvements.
See individual commit messages and #654 for more detail.
Updates #654
<!-- Reviewable:start -->
This change is <img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/> <!-- Reviewable:end -->
pr closed time in 14 days
push eventtailscale/tailscale
commit sha 31c13013ae39962b6fa66287aecd51e24c9ac980
wgengine/router: tolerate disabled IPv6 on Windows Fixes #412 Updates #524 (maybe fixes?) Signed-off-by: Brad Fitzpatrick <[email protected]>
commit sha a084c44afca32eb3e05c3c5823509d07b2c78713
wgengine, wgengine/router, cmd/tailscale: force netfilter mode off on Synology For now. Get it working again so it's not stuck on 0.98. Subnet relay can come later. Updates #451 Signed-off-by: Brad Fitzpatrick <[email protected]>
commit sha 3af64765fd5808e72ddd2b29888c3defe9bf5026
ipn: fix Windows crash from improperly strict assertion
commit sha 4f71319f7cfb1eb43797cce123bc461b2ecd9521
ipn/ipnserver: make ipnserver also be an HTTP server for localhost clients For now it just says hello to show auth works. More later.
commit sha 4f7751e02512a80180d6844ab990cf58980a6a17
Update depaware for previous ipnserver change.
commit sha 662c19551ac6d052969e37769996ac2e818ad8aa
control/controlclient: deal with localized 'Version' string getting Windows version
commit sha 41f6c78c5315dbea56b44de684e9664640fb17f9
go.mod: bump depaware to get diffs out of -check
commit sha 78f7f1ea66e557c8511638e06aebe8cc7a79944c
wgengine/magicsock: improve test logging output This fixes line numbers and reduces timestamp precision to overwhelming the output. Signed-off-by: Josh Bleecher Snyder <[email protected]>
commit sha 8debb032f19836a0c5abb7b22f0b8d003cdd722c
wgengine/magicsock: make discoPingPurpose a stringer It was useful for debugging once, it'll probably be useful again. Signed-off-by: Josh Bleecher Snyder <[email protected]>
commit sha 99f9b37449a4abd80d9e3d871bc445fddc6e85ab
wgengine/magicsock: increase test timeout to reduce flakiness Updates #654. See that issue for a discussion of why this timeout reduces flakiness, and what next steps are. Signed-off-by: Josh Bleecher Snyder <[email protected]>
push time in 14 days
push eventtailscale/tailscale
commit sha 41f6c78c5315dbea56b44de684e9664640fb17f9
go.mod: bump depaware to get diffs out of -check
push time in 14 days
push eventtailscale/depaware
commit sha 3f1070fd0d558fad55562b3349d2c4257f8e81c4
write a diff when -check fails This makes it easier to understand what went wrong when depaware fails in a CI or other non-local context. The diff could be improved, in that a single addition can cause cascading diffs. For example, adding a bufio dependency to a package can cause this: - bytes from encoding/json+ + bytes from bufio+ Observe that bytes didn't really change meaningfully--it was imported by >=2 packages before, and it still is. But now it is imported by bufio, which is alphabetically prior to encoding/json. This adds a bunch of noise to the diffs. It's not obvious what the best fix to this is. Sample output, from running on this commit: $ TERM=dumb go run depaware-main.go -check . The list of dependencies in /Users/josh/t/depaware/depaware.txt are out of date. --- before +++ after @@ -1,16 +1,23 @@ github.com/tailscale/depaware dependencies: (generated by github.com/tailscale/depaware) + github.com/pkg/diff from github.com/tailscale/depaware/depaware + github.com/pkg/diff/ctxt from github.com/pkg/diff + github.com/pkg/diff/edit from github.com/pkg/diff/ctxt+ + github.com/pkg/diff/intern from github.com/pkg/diff + github.com/pkg/diff/myers from github.com/pkg/diff + github.com/pkg/diff/write from github.com/pkg/diff+ github.com/tailscale/depaware/depaware from github.com/tailscale/depaware - bytes from encoding/json+ - context from os/exec + bufio from github.com/pkg/diff+ + bytes from bufio+ + context from github.com/pkg/diff+ encoding from encoding/json encoding/base64 from encoding/json encoding/binary from encoding/base64 encoding/json from github.com/tailscale/depaware/depaware - errors from bytes+ + errors from bufio+ flag from github.com/tailscale/depaware/depaware fmt from encoding/json+ - io from bytes+ + io from bufio+ io/ioutil from github.com/tailscale/depaware/depaware log from github.com/tailscale/depaware/depaware math from encoding/binary+ @@ -21,12 +28,12 @@ reflect from encoding/binary+ sort from encoding/json+ strconv from encoding/base64+ - strings from encoding/json+ + strings from bufio+ sync from context+ sync/atomic from context+ syscall from internal/poll+ time from context+ unicode from bytes+ unicode/utf16 from encoding/json+ - unicode/utf8 from bytes+ + unicode/utf8 from bufio+ unsafe from internal/bytealg+ exit status 1
push time in 14 days
issue openedtailscale/depaware
use "<multiple packages>" instead of "samplepkg+" when imported multiple times
depaware.txt diffs can be very noisy. See e.g. the diff in https://github.com/tailscale/depaware/pull/3/commits. Many of those changes are of the form:
- bytes from encoding/json+
+ bytes from bufio+
I propose that when a package is imported by >1 package, we write <multiple packages> instead of using lexifirst+. This provides less information, but will be much more stable.
Optionally, we could also add a -all flag (better name welcome) that spells out every single importing package like bufio,encoding/json, instead of <multiple packages>. That would be useful for someone actively trying to cut dependencies. And teams might choose to use it all the time; with a good intra-line diff, it'd generate usable diffs again.
I'm willing to implementation, but feedback on design requested first.
created time in 14 days
push eventpkg/diff
commit sha 7cc3ed0907612adbf15333ca2e30315e97009d3c
edit: create package Part of #18. There are some unfortunate API changes as part of this, such as the new EditScriptWithContextSize, since edit.Script is now part of a different package. Those will get ironed out as the refactoring continues.
commit sha f932f2c54714ccef80294672aa92ce93026bad93
myers: create package Part of #18.
commit sha 9897735d8fe2c16c115f3fe155d178f090ab699b
ctxt: create package Part of #18.
commit sha b63e0faf7226324a50d703393e48865cc4615691
move some TODOs from diff.go to adaptor.go
commit sha a78b2397ab6b2815d9e61ad1019a8ed1736daf51
write: create package Part of #18. I am very torn about having a single write package with a routine per format: write.Pair write.Option write.Names write.Unified write.SideBySide vs having a package per format: write.Option write.Names unified.Pair unified.Write sidebyside.Pair sidebyside.Write One motivation for separate packages is that the ideal interface for different formats is different. For unified, WriteTo is high performance, and we don't need more. For side by side, we need to be able to inspect and even modify the line before writing, so it makes more sense to have an interface specified in terms of []byte. However, we can use a bytes.Buffer internally to bridge from WriteTo to []byte, and most write options are shared between the formats. So for the moment, try out a single write package. Maybe Daniel (or someone else) will have a compelling reason to go one way or another. The adaptor API is getting ugly. It'll get fixed (mostly eliminated) soon.
commit sha 0a511de994d6e2d29b1d628fea9bacace88b720e
remove adapters, create wrappers package diff now has a simple, single-call API. for more control, people can use the subpackages. Part of #18.
commit sha eb1debf3ee33d36d88f8c3909068e595d4b49abf
ctxt: add todos
commit sha de2f738bc65407e924f31369a8450c671c8db34d
fuzz: fix fuzz function
commit sha 859542ea7d2e4fc6d5312cd3dc8d51fa3670a941
go.sum: let cmd/go scribble
commit sha f0356d9df2d0b8786f97730071a23520215e75a0
update readme and todo
commit sha 84ebd80e9130ff3bc3899be1ca092ff31e2621a7
all: clean up some docs
commit sha 0bf1797b23964681d63cacab514f5ae094eb15b0
write: check err from Unified in test
commit sha 4849219ecbd68faa95ff0faf37e654d593d7781e
cmd/pkg-diff-example: support use as an external git diff tool this makes it easier to quickly use it on real world diffs. sample usage: $ GIT_EXTERNAL_DIFF="`which pkg-diff-example` -color" git diff
commit sha 41cc38ae142420c0fd15ca63e3ae02ffdf91068d
write: use bufio instead of errWriter This simplifies the code and improves performance. The downside is that we no longer know the number of bytes written. (This entails an API change, which is the reason to do it now, while we can.) But this is not a common need, and worst case, callers can count themselves by wrapping their writer in a counting writer.
commit sha 13b73a993604f83bc121134de1ab3466163cdfca
all: add a high level benchmark actually, add a high level benchmark framework. the first fixture comes from commit 870080752d175d5cede350486acf36213c64f35c in the Go repository. it is a large generated file that got regenerated in that commit into a more compact form. it has small changes scattered throughout a large file. it is thus a nice torture test for a diff algorithm.
commit sha 4065ac9eb877c54e35f6e748e916c8cdcf44bbad
myers: fix stupid amounts of allocation and copying that was shockingly lazy code to have written, TODO or not TODO. fix it. name old time/op new time/op delta Golden/testdata/rewriteAMD64.go-8 23.9s ±42% 0.5s ± 2% -97.98% (p=0.000 n=10+9) name old alloc/op new alloc/op delta Golden/testdata/rewriteAMD64.go-8 19.5GB ± 0% 0.8GB ± 0% -96.02% (p=0.000 n=9+10) name old allocs/op new allocs/op delta Golden/testdata/rewriteAMD64.go-8 150k ± 0% 150k ± 0% -0.00% (p=0.000 n=10+10)
commit sha e8890afd1f155a280f47e8a7e9d35bee670bc9c9
intern: create package there's not much to it, but it does prevent others from having to roll their own, which is broadly speaking the point of this module. name old time/op new time/op delta Golden/testdata/rewriteAMD64.go-8 482ms ± 2% 418ms ± 2% -13.22% (p=0.000 n=9+9) name old alloc/op new alloc/op delta Golden/testdata/rewriteAMD64.go-8 777MB ± 0% 770MB ± 0% -0.90% (p=0.000 n=10+10) name old allocs/op new allocs/op delta Golden/testdata/rewriteAMD64.go-8 150k ± 0% 41k ± 0% -72.60% (p=0.000 n=10+10)
commit sha 3b17ca09f7ba42274135828b79e5e99ecbf57b00
readme: refer to module by its full path
commit sha 0f84953dec38f4d58659769a00b1c2e9f7b69632
myers: specify which myers' diff algorithm we're using i believe this may explain the significant performance gap between this module and git's implementation. good thing i'm doing all this digging while the api still has some flexibility. eek. :) updates #18, insofar as it means that i want to do some more implementing before declaring this part of the api stable.
commit sha d40ec79d4dfb8c6cc323aa9ae2e877f03a6c993b
readme: add another diff implementation resource
push time in 14 days
issue commentsethvargo/go-signalcontext
This feels kinda rude.
comment created time in 16 days
pull request commenttailscale/tailscale
wgengine/magicsock: reduce test flakiness
I don't understand why the depaware check is failing; depaware passes locally for me, and I don't think I added any new dependencies. On Monday I'll make depaware's --check more verbose to figure it out. This PR can wait until then.
comment created time in 17 days