diff --git a/client/web/auth.go b/client/web/auth.go index c95cba1e9..8b195a417 100644 --- a/client/web/auth.go +++ b/client/web/auth.go @@ -223,7 +223,7 @@ func (s *Server) awaitUserAuth(ctx context.Context, session *browserSession) err func (s *Server) newSessionID() (string, error) { raw := make([]byte, 16) - for i := 0; i < 5; i++ { + for range 5 { if _, err := rand.Read(raw); err != nil { return "", err } diff --git a/clientupdate/clientupdate.go b/clientupdate/clientupdate.go index 2a08d6638..3a24110b9 100644 --- a/clientupdate/clientupdate.go +++ b/clientupdate/clientupdate.go @@ -436,7 +436,7 @@ func (up *Updater) updateDebLike() error { return fmt.Errorf("apt-get update failed: %w; output:\n%s", err, out) } - for i := 0; i < 2; i++ { + for range 2 { out, err := exec.Command("apt-get", "install", "--yes", "--allow-downgrades", "tailscale="+ver).CombinedOutput() if err != nil { if !bytes.Contains(out, []byte(`dpkg was interrupted`)) { diff --git a/clientupdate/clientupdate_test.go b/clientupdate/clientupdate_test.go index eaad1206e..dc8f66fd6 100644 --- a/clientupdate/clientupdate_test.go +++ b/clientupdate/clientupdate_test.go @@ -663,7 +663,7 @@ func genTarball(t *testing.T, path string, files map[string]string) { func TestWriteFileOverwrite(t *testing.T) { path := filepath.Join(t.TempDir(), "test") - for i := 0; i < 2; i++ { + for i := range 2 { content := fmt.Sprintf("content %d", i) if err := writeFile(strings.NewReader(content), path, 0600); err != nil { t.Fatal(err) diff --git a/clientupdate/distsign/distsign_test.go b/clientupdate/distsign/distsign_test.go index a74c14fd4..09a701f49 100644 --- a/clientupdate/distsign/distsign_test.go +++ b/clientupdate/distsign/distsign_test.go @@ -445,7 +445,7 @@ type testServer struct { func newTestServer(t *testing.T) *testServer { var roots []rootKeyPair - for i := 0; i < 3; i++ { + for range 3 { roots = append(roots, newRootKeyPair(t)) } diff --git a/cmd/cloner/cloner.go b/cmd/cloner/cloner.go index 8e2944115..937fd9059 100644 --- a/cmd/cloner/cloner.go +++ b/cmd/cloner/cloner.go @@ -102,7 +102,7 @@ func gen(buf *bytes.Buffer, it *codegen.ImportTracker, typ *types.Named) { writef("}") writef("dst := new(%s)", name) writef("*dst = *src") - for i := 0; i < t.NumFields(); i++ { + for i := range t.NumFields() { fname := t.Field(i).Name() ft := t.Field(i).Type() if !codegen.ContainsPointers(ft) || codegen.HasNoClone(t.Tag(i)) { diff --git a/cmd/k8s-operator/testutils_test.go b/cmd/k8s-operator/testutils_test.go index c9377cfad..a4a6a7ffd 100644 --- a/cmd/k8s-operator/testutils_test.go +++ b/cmd/k8s-operator/testutils_test.go @@ -522,7 +522,7 @@ func expectEvents(t *testing.T, rec *record.FakeRecorder, wantsEvents []string) t.Helper() // Events are not expected to arrive in order. seenEvents := make([]string, 0) - for i := 0; i < len(wantsEvents); i++ { + for range len(wantsEvents) { timer := time.NewTimer(time.Second * 5) defer timer.Stop() select { diff --git a/cmd/netlogfmt/main.go b/cmd/netlogfmt/main.go index 19db2797a..65e87098f 100644 --- a/cmd/netlogfmt/main.go +++ b/cmd/netlogfmt/main.go @@ -314,7 +314,7 @@ func mustMakeNamesByAddr() map[netip.Addr]string { seen := make(map[string]bool) namesByAddr := make(map[netip.Addr]string) retry: - for i := 0; i < 10; i++ { + for i := range 10 { clear(seen) clear(namesByAddr) for _, d := range m.Devices { @@ -354,7 +354,7 @@ func fieldPrefix(s string, n int) string { } func appendRepeatByte(b []byte, c byte, n int) []byte { - for i := 0; i < n; i++ { + for range n { b = append(b, c) } return b diff --git a/cmd/proxy-to-grafana/proxy-to-grafana.go b/cmd/proxy-to-grafana/proxy-to-grafana.go index b5b67ee80..35bebdbad 100644 --- a/cmd/proxy-to-grafana/proxy-to-grafana.go +++ b/cmd/proxy-to-grafana/proxy-to-grafana.go @@ -88,7 +88,7 @@ func main() { go func() { // wait for tailscale to start before trying to fetch cert names - for i := 0; i < 60; i++ { + for range 60 { st, err := localClient.Status(context.Background()) if err != nil { log.Printf("error retrieving tailscale status; retrying: %v", err) diff --git a/cmd/sniproxy/sniproxy_test.go b/cmd/sniproxy/sniproxy_test.go index 1e9396cf1..324445ba4 100644 --- a/cmd/sniproxy/sniproxy_test.go +++ b/cmd/sniproxy/sniproxy_test.go @@ -158,7 +158,7 @@ func TestSNIProxyWithNetmapConfig(t *testing.T) { t.Fatal(err) } gotConfigured := false - for i := 0; i < 100; i++ { + for range 100 { s, err := l.StatusWithoutPeers(ctx) if err != nil { t.Fatal(err) diff --git a/cmd/tailscale/cli/cli_test.go b/cmd/tailscale/cli/cli_test.go index 5b438ec9c..52966a4bd 100644 --- a/cmd/tailscale/cli/cli_test.go +++ b/cmd/tailscale/cli/cli_test.go @@ -831,7 +831,7 @@ func TestPrefFlagMapping(t *testing.T) { } prefType := reflect.TypeFor[ipn.Prefs]() - for i := 0; i < prefType.NumField(); i++ { + for i := range prefType.NumField() { prefName := prefType.Field(i).Name if prefHasFlag[prefName] { continue diff --git a/cmd/tailscale/cli/network-lock.go b/cmd/tailscale/cli/network-lock.go index 09f87f1d4..ff256992a 100644 --- a/cmd/tailscale/cli/network-lock.go +++ b/cmd/tailscale/cli/network-lock.go @@ -148,7 +148,7 @@ func runNetworkLockInit(ctx context.Context, args []string) error { } fmt.Printf("%d disablement secrets have been generated and are printed below. Take note of them now, they WILL NOT be shown again.\n", nlInitArgs.numDisablements) - for i := 0; i < nlInitArgs.numDisablements; i++ { + for range nlInitArgs.numDisablements { var secret [32]byte if _, err := rand.Read(secret[:]); err != nil { return err diff --git a/cmd/tailscale/cli/serve_legacy.go b/cmd/tailscale/cli/serve_legacy.go index 285bb932e..443a404ab 100644 --- a/cmd/tailscale/cli/serve_legacy.go +++ b/cmd/tailscale/cli/serve_legacy.go @@ -387,7 +387,7 @@ func isProxyTarget(source string) bool { // allNumeric reports whether s only comprises of digits // and has at least one digit. func allNumeric(s string) bool { - for i := 0; i < len(s); i++ { + for i := range len(s) { if s[i] < '0' || s[i] > '9' { return false } diff --git a/cmd/testcontrol/testcontrol.go b/cmd/testcontrol/testcontrol.go index 54e21735b..b05b3128d 100644 --- a/cmd/testcontrol/testcontrol.go +++ b/cmd/testcontrol/testcontrol.go @@ -29,7 +29,7 @@ func main() { DERPMap: derpMap, ExplicitBaseURL: "http://127.0.0.1:9911", } - for i := 0; i < *flagNFake; i++ { + for range *flagNFake { control.AddFakeNode() } mux := http.NewServeMux() diff --git a/cmd/viewer/viewer.go b/cmd/viewer/viewer.go index 88aab997f..a83499a69 100644 --- a/cmd/viewer/viewer.go +++ b/cmd/viewer/viewer.go @@ -149,7 +149,7 @@ func genView(buf *bytes.Buffer, it *codegen.ImportTracker, typ *types.Named, thi } } writeTemplate("common") - for i := 0; i < t.NumFields(); i++ { + for i := range t.NumFields() { f := t.Field(i) fname := f.Name() if !f.Exported() { @@ -292,7 +292,7 @@ func genView(buf *bytes.Buffer, it *codegen.ImportTracker, typ *types.Named, thi } writeTemplate("unsupportedField") } - for i := 0; i < typ.NumMethods(); i++ { + for i := range typ.NumMethods() { f := typ.Method(i) if !f.Exported() { continue diff --git a/control/controlbase/conn_test.go b/control/controlbase/conn_test.go index 504d1dbf5..8a0f46967 100644 --- a/control/controlbase/conn_test.go +++ b/control/controlbase/conn_test.go @@ -91,7 +91,7 @@ func TestFastPath(t *testing.T) { const packets = 10 s := "test" - for i := 0; i < packets; i++ { + for range packets { // Many separate writes, to force separate Noise frames that // all get buffered up and then all sent as a single slice to // the server. @@ -251,7 +251,7 @@ func TestConnMemoryOverhead(t *testing.T) { } defer closeAll() - for i := 0; i < num; i++ { + for range num { client, server := pair(t) closers = append(closers, client, server) go func() { diff --git a/control/controlbase/handshake_test.go b/control/controlbase/handshake_test.go index e4400c95d..242b1f4d7 100644 --- a/control/controlbase/handshake_test.go +++ b/control/controlbase/handshake_test.go @@ -64,7 +64,7 @@ func TestNoReuse(t *testing.T) { serverHandshakes = map[[48]byte]bool{} packets = map[[32]byte]bool{} ) - for i := 0; i < 10; i++ { + for range 10 { var ( clientRaw, serverRaw = memnet.NewConn("noise", 128000) clientBuf, serverBuf bytes.Buffer @@ -162,7 +162,7 @@ func (r *tamperReader) Read(bs []byte) (int, error) { func TestTampering(t *testing.T) { // Tamper with every byte of the client initiation message. - for i := 0; i < 101; i++ { + for i := range 101 { var ( clientConn, serverRaw = memnet.NewConn("noise", 128000) serverConn = &readerConn{serverRaw, &tamperReader{serverRaw, i, 0}} @@ -190,7 +190,7 @@ func TestTampering(t *testing.T) { } // Tamper with every byte of the server response message. - for i := 0; i < 51; i++ { + for i := range 51 { var ( clientRaw, serverConn = memnet.NewConn("noise", 128000) clientConn = &readerConn{clientRaw, &tamperReader{clientRaw, i, 0}} @@ -215,7 +215,7 @@ func TestTampering(t *testing.T) { } // Tamper with every byte of the first server>client transport message. - for i := 0; i < 30; i++ { + for i := range 30 { var ( clientRaw, serverConn = memnet.NewConn("noise", 128000) clientConn = &readerConn{clientRaw, &tamperReader{clientRaw, 51 + i, 0}} @@ -256,7 +256,7 @@ func TestTampering(t *testing.T) { } // Tamper with every byte of the first client>server transport message. - for i := 0; i < 30; i++ { + for i := range 30 { var ( clientConn, serverRaw = memnet.NewConn("noise", 128000) serverConn = &readerConn{serverRaw, &tamperReader{serverRaw, 101 + i, 0}} diff --git a/control/controlclient/controlclient_test.go b/control/controlclient/controlclient_test.go index c608ef6cc..b37623451 100644 --- a/control/controlclient/controlclient_test.go +++ b/control/controlclient/controlclient_test.go @@ -9,7 +9,7 @@ import ( ) func fieldsOf(t reflect.Type) (fields []string) { - for i := 0; i < t.NumField(); i++ { + for i := range t.NumField() { if name := t.Field(i).Name; name != "_" { fields = append(fields, name) } diff --git a/control/controlclient/map.go b/control/controlclient/map.go index 4f19e9753..2468226d1 100644 --- a/control/controlclient/map.go +++ b/control/controlclient/map.go @@ -563,7 +563,7 @@ var nodeFields = sync.OnceValue(getNodeFields) func getNodeFields() []string { rt := reflect.TypeFor[tailcfg.Node]() ret := make([]string, rt.NumField()) - for i := 0; i < rt.NumField(); i++ { + for i := range rt.NumField() { ret[i] = rt.Field(i).Name } return ret diff --git a/control/controlclient/map_test.go b/control/controlclient/map_test.go index 4a9002e17..897036a94 100644 --- a/control/controlclient/map_test.go +++ b/control/controlclient/map_test.go @@ -1019,7 +1019,7 @@ func BenchmarkMapSessionDelta(b *testing.B) { Name: "foo.bar.ts.net.", }, } - for i := 0; i < size; i++ { + for i := range size { res.Peers = append(res.Peers, &tailcfg.Node{ ID: tailcfg.NodeID(i + 2), Name: fmt.Sprintf("peer%d.bar.ts.net.", i), @@ -1046,7 +1046,7 @@ func BenchmarkMapSessionDelta(b *testing.B) { // Now for the core of the benchmark loop, just toggle // a single node's online status. - for i := 0; i < b.N; i++ { + for i := range b.N { if err := ms.HandleNonKeepAliveMapResponse(ctx, &tailcfg.MapResponse{ OnlineChange: map[tailcfg.NodeID]bool{ 2: i%2 == 0, diff --git a/control/controlhttp/http_test.go b/control/controlhttp/http_test.go index 00433d1be..879305ead 100644 --- a/control/controlhttp/http_test.go +++ b/control/controlhttp/http_test.go @@ -729,7 +729,7 @@ func (d *closeTrackDialer) Done() { // Sleep/wait a few times on the assumption that things will close // "eventually". const iters = 100 - for i := 0; i < iters; i++ { + for i := range iters { d.mu.Lock() if len(d.conns) == 0 { d.mu.Unlock() diff --git a/derp/derp_test.go b/derp/derp_test.go index c66d40142..50d248e0d 100644 --- a/derp/derp_test.go +++ b/derp/derp_test.go @@ -56,7 +56,7 @@ func TestSendRecv(t *testing.T) { const numClients = 3 var clientPrivateKeys []key.NodePrivate var clientKeys []key.NodePublic - for i := 0; i < numClients; i++ { + for range numClients { priv := key.NewNode() clientPrivateKeys = append(clientPrivateKeys, priv) clientKeys = append(clientKeys, priv.Public()) @@ -73,7 +73,7 @@ func TestSendRecv(t *testing.T) { var recvChs []chan []byte errCh := make(chan error, 3) - for i := 0; i < numClients; i++ { + for i := range numClients { t.Logf("Connecting client %d ...", i) cout, err := net.Dial("tcp", ln.Addr().String()) if err != nil { @@ -111,7 +111,7 @@ func TestSendRecv(t *testing.T) { var peerGoneCountNotHere expvar.Int t.Logf("Starting read loops") - for i := 0; i < numClients; i++ { + for i := range numClients { go func(i int) { for { m, err := clients[i].Recv() @@ -233,7 +233,7 @@ func TestSendRecv(t *testing.T) { wantUnknownPeers(1) // PeerGoneNotHere is rate-limited to 3 times a second - for i := 0; i < 5; i++ { + for range 5 { if err := clients[1].Send(neKey, callMe); err != nil { t.Fatal(err) } @@ -389,7 +389,7 @@ func TestSendFreeze(t *testing.T) { // if any tokens remain in the channel, they // must have been generated after drainAny was // called. - for i := 0; i < cap(ch); i++ { + for range cap(ch) { select { case <-ch: default: @@ -456,7 +456,7 @@ func TestSendFreeze(t *testing.T) { aliceConn.Close() cathyConn.Close() - for i := 0; i < cap(errCh); i++ { + for range cap(errCh) { err := <-errCh if err != nil { if errors.Is(err, io.EOF) || errors.Is(err, net.ErrClosed) { @@ -891,7 +891,7 @@ func TestMultiForwarder(t *testing.T) { // run long enough concurrently with {Add,Remove}PacketForwarder loop above. numMsgs := 5000 var fwd PacketForwarder - for i := 0; i < numMsgs; i++ { + for i := range numMsgs { s.mu.Lock() fwd = s.clientsMesh[u] s.mu.Unlock() @@ -1288,7 +1288,7 @@ func TestServerDupClients(t *testing.T) { func TestLimiter(t *testing.T) { rl := rate.NewLimiter(rate.Every(time.Minute), 100) - for i := 0; i < 200; i++ { + for i := range 200 { r := rl.Reserve() d := r.Delay() t.Logf("i=%d, allow=%v, d=%v", i, r.OK(), d) @@ -1352,7 +1352,7 @@ func benchmarkSendRecvSize(b *testing.B, packetSize int) { b.SetBytes(int64(len(msg))) b.ReportAllocs() b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { if err := client.Send(clientKey, msg); err != nil { b.Fatal(err) } @@ -1363,7 +1363,7 @@ func BenchmarkWriteUint32(b *testing.B) { w := bufio.NewWriter(io.Discard) b.ReportAllocs() b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { writeUint32(w, 0x0ba3a) } } @@ -1381,7 +1381,7 @@ func BenchmarkReadUint32(b *testing.B) { var err error b.ReportAllocs() b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { sinkU32, err = readUint32(r) if err != nil { b.Fatal(err) @@ -1454,7 +1454,7 @@ func TestClientSendRateLimiting(t *testing.T) { // Flood should all succeed. cw.ResetStats() - for i := 0; i < 1000; i++ { + for range 1000 { if err := c.send(key.NodePublic{}, pkt); err != nil { t.Fatal(err) } @@ -1473,7 +1473,7 @@ func TestClientSendRateLimiting(t *testing.T) { TokenBucketBytesPerSecond: 1, TokenBucketBytesBurst: int(bytes1 * 2), }) - for i := 0; i < 1000; i++ { + for range 1000 { if err := c.send(key.NodePublic{}, pkt); err != nil { t.Fatal(err) } diff --git a/derp/derphttp/derphttp_test.go b/derp/derphttp/derphttp_test.go index dc5acf49f..8f2b5ee92 100644 --- a/derp/derphttp/derphttp_test.go +++ b/derp/derphttp/derphttp_test.go @@ -25,7 +25,7 @@ func TestSendRecv(t *testing.T) { const numClients = 3 var clientPrivateKeys []key.NodePrivate var clientKeys []key.NodePublic - for i := 0; i < numClients; i++ { + for range numClients { priv := key.NewNode() clientPrivateKeys = append(clientPrivateKeys, priv) clientKeys = append(clientKeys, priv.Public()) @@ -66,7 +66,7 @@ func TestSendRecv(t *testing.T) { } wg.Wait() }() - for i := 0; i < numClients; i++ { + for i := range numClients { key := clientPrivateKeys[i] c, err := NewClient(key, serverURL, t.Logf) if err != nil { @@ -311,7 +311,7 @@ func TestBreakWatcherConnRecv(t *testing.T) { // Wait for the watcher to run, then break the connection and check if it // reconnected and received peer updates. - for i := 0; i < 10; i++ { + for range 10 { select { case peers := <-watcherChan: if peers != 1 { @@ -384,7 +384,7 @@ func TestBreakWatcherConn(t *testing.T) { // Wait for the watcher to run, then break the connection and check if it // reconnected and received peer updates. - for i := 0; i < 10; i++ { + for range 10 { select { case peers := <-watcherChan: if peers != 1 { diff --git a/health/health_test.go b/health/health_test.go index 78d1422a2..552cec495 100644 --- a/health/health_test.go +++ b/health/health_test.go @@ -15,7 +15,7 @@ import ( func TestAppendWarnableDebugFlags(t *testing.T) { resetWarnables() - for i := 0; i < 10; i++ { + for i := range 10 { w := NewWarnable(WithMapDebugFlag(fmt.Sprint(i))) if i%2 == 0 { w.Set(errors.New("boom")) @@ -25,7 +25,7 @@ func TestAppendWarnableDebugFlags(t *testing.T) { want := []string{"z", "y", "0", "2", "4", "6", "8"} var got []string - for i := 0; i < 20; i++ { + for range 20 { got = append(got[:0], "z", "y") got = AppendWarnableDebugFlags(got) if !reflect.DeepEqual(got, want) { diff --git a/ipn/ipnlocal/drive.go b/ipn/ipnlocal/drive.go index ef2e6a7cc..419058643 100644 --- a/ipn/ipnlocal/drive.go +++ b/ipn/ipnlocal/drive.go @@ -93,7 +93,7 @@ func (b *LocalBackend) driveSetShareLocked(share *drive.Share) (views.SliceView[ addedShare := false var shares []*drive.Share - for i := 0; i < existingShares.Len(); i++ { + for i := range existingShares.Len() { existing := existingShares.At(i) if existing.Name() != share.Name { if !addedShare && existing.Name() > share.Name { @@ -152,7 +152,7 @@ func (b *LocalBackend) driveRenameShareLocked(oldName, newName string) (views.Sl found := false var shares []*drive.Share - for i := 0; i < existingShares.Len(); i++ { + for i := range existingShares.Len() { existing := existingShares.At(i) if existing.Name() == newName { return existingShares, os.ErrExist @@ -213,7 +213,7 @@ func (b *LocalBackend) driveRemoveShareLocked(name string) (views.SliceView[*dri found := false var shares []*drive.Share - for i := 0; i < existingShares.Len(); i++ { + for i := range existingShares.Len() { existing := existingShares.At(i) if existing.Name() != name { shares = append(shares, existing.AsStruct()) @@ -281,7 +281,7 @@ func driveShareViewsEqual(a *views.SliceView[*drive.Share, drive.ShareView], b v return false } - for i := 0; i < a.Len(); i++ { + for i := range a.Len() { if !drive.ShareViewsEqual(a.At(i), b.At(i)) { return false } diff --git a/ipn/ipnlocal/local.go b/ipn/ipnlocal/local.go index 5a40c515c..4908b363e 100644 --- a/ipn/ipnlocal/local.go +++ b/ipn/ipnlocal/local.go @@ -446,7 +446,7 @@ func NewLocalBackend(logf logger.Logf, logID logid.PublicID, sys *tsd.System, lo currentShares := b.pm.prefs.DriveShares() if currentShares.Len() > 0 { var shares []*drive.Share - for i := 0; i < currentShares.Len(); i++ { + for i := range currentShares.Len() { shares = append(shares, currentShares.At(i).AsStruct()) } fs.SetShares(shares) @@ -1855,7 +1855,7 @@ func (b *LocalBackend) updateFilterLocked(netMap *netmap.NetworkMap, prefs ipn.P } if prefs.Valid() { ar := prefs.AdvertiseRoutes() - for i := 0; i < ar.Len(); i++ { + for i := range ar.Len() { r := ar.At(i) if r.Bits() == 0 { // When offering a default route to the world, we @@ -5418,7 +5418,7 @@ func (b *LocalBackend) OfferingExitNode() bool { } var def4, def6 bool ar := b.pm.CurrentPrefs().AdvertiseRoutes() - for i := 0; i < ar.Len(); i++ { + for i := range ar.Len() { r := ar.At(i) if r.Bits() != 0 { continue diff --git a/ipn/ipnlocal/local_test.go b/ipn/ipnlocal/local_test.go index 1e96a743f..65fd981a9 100644 --- a/ipn/ipnlocal/local_test.go +++ b/ipn/ipnlocal/local_test.go @@ -949,7 +949,7 @@ func TestUpdateNetmapDelta(t *testing.T) { } b.netMap = &netmap.NetworkMap{} - for i := 0; i < 5; i++ { + for i := range 5 { b.netMap.Peers = append(b.netMap.Peers, (&tailcfg.Node{ID: (tailcfg.NodeID(i) + 1)}).View()) } b.updatePeersFromNetmapLocked(b.netMap) diff --git a/ipn/ipnlocal/loglines_test.go b/ipn/ipnlocal/loglines_test.go index 159a9e211..8334b7f57 100644 --- a/ipn/ipnlocal/loglines_test.go +++ b/ipn/ipnlocal/loglines_test.go @@ -39,7 +39,7 @@ func TestLocalLogLines(t *testing.T) { logid := func(hex byte) logid.PublicID { var ret logid.PublicID - for i := 0; i < len(ret); i++ { + for i := range len(ret) { ret[i] = hex } return ret diff --git a/ipn/ipnlocal/network-lock.go b/ipn/ipnlocal/network-lock.go index 7f158e81d..2f5d5b09c 100644 --- a/ipn/ipnlocal/network-lock.go +++ b/ipn/ipnlocal/network-lock.go @@ -338,7 +338,7 @@ func (b *LocalBackend) tkaBootstrapFromGenesisLocked(g tkatype.MarshaledAUM, per } bootstrapStateID := fmt.Sprintf("%d:%d", genesis.State.StateID1, genesis.State.StateID2) - for i := 0; i < persist.DisallowedTKAStateIDs().Len(); i++ { + for i := range persist.DisallowedTKAStateIDs().Len() { stateID := persist.DisallowedTKAStateIDs().At(i) if stateID == bootstrapStateID { return fmt.Errorf("TKA with stateID of %q is disallowed on this node", stateID) @@ -439,7 +439,7 @@ func (b *LocalBackend) NetworkLockStatus() *ipnstate.NetworkLockStatus { } filtered := make([]*ipnstate.TKAFilteredPeer, len(b.tka.filtered)) - for i := 0; i < len(filtered); i++ { + for i := range len(filtered) { filtered[i] = b.tka.filtered[i].Clone() } @@ -765,7 +765,7 @@ func (b *LocalBackend) NetworkLockLog(maxEntries int) ([]ipnstate.NetworkLockUpd var out []ipnstate.NetworkLockUpdate cursor := b.tka.authority.Head() - for i := 0; i < maxEntries; i++ { + for range maxEntries { aum, err := b.tka.storage.AUM(cursor) if err != nil { if err == os.ErrNotExist { diff --git a/ipn/ipnlocal/peerapi_test.go b/ipn/ipnlocal/peerapi_test.go index 435ce5017..bffbb1076 100644 --- a/ipn/ipnlocal/peerapi_test.go +++ b/ipn/ipnlocal/peerapi_test.go @@ -109,7 +109,7 @@ func fileHasContents(name string, want string) check { func hexAll(v string) string { var sb strings.Builder - for i := 0; i < len(v); i++ { + for i := range len(v) { fmt.Fprintf(&sb, "%%%02x", v[i]) } return sb.String() @@ -604,7 +604,7 @@ func TestFileDeleteRace(t *testing.T) { ps: ps, } buf := make([]byte, 2<<20) - for i := 0; i < 30; i++ { + for range 30 { rr := httptest.NewRecorder() ph.ServeHTTP(rr, httptest.NewRequest("PUT", "http://100.100.100.101:123/v0/put/foo.txt", bytes.NewReader(buf[:rand.Intn(len(buf))]))) if res := rr.Result(); res.StatusCode != 200 { diff --git a/ipn/ipnlocal/serve.go b/ipn/ipnlocal/serve.go index 5563ca3ca..4e4af5f99 100644 --- a/ipn/ipnlocal/serve.go +++ b/ipn/ipnlocal/serve.go @@ -868,7 +868,7 @@ func expandProxyArg(s string) (targetURL string, insecureSkipVerify bool) { } func allNumeric(s string) bool { - for i := 0; i < len(s); i++ { + for i := range len(s) { if s[i] < '0' || s[i] > '9' { return false } diff --git a/ipn/ipnlocal/state_test.go b/ipn/ipnlocal/state_test.go index 5b2d839a9..1f216e4f1 100644 --- a/ipn/ipnlocal/state_test.go +++ b/ipn/ipnlocal/state_test.go @@ -70,7 +70,7 @@ func (nt *notifyThrottler) drain(count int) []ipn.Notify { nt.mu.Unlock() nn := []ipn.Notify{} - for i := 0; i < count; i++ { + for i := range count { select { case n := <-ch: nn = append(nn, n) @@ -1039,7 +1039,7 @@ func TestWGEngineStatusRace(t *testing.T) { // we would end up in state ipn.Running. // The same should thus be true if these callbacks occur concurrently. var wg sync.WaitGroup - for i := 0; i < 100; i++ { + for i := range 100 { wg.Add(1) go func(i int) { defer wg.Done() diff --git a/ipn/ipnserver/server.go b/ipn/ipnserver/server.go index b414e05a4..787880f9e 100644 --- a/ipn/ipnserver/server.go +++ b/ipn/ipnserver/server.go @@ -342,7 +342,7 @@ func userIDFromString(v string) string { } func isAllDigit(s string) bool { - for i := 0; i < len(s); i++ { + for i := range len(s) { if b := s[i]; b < '0' || b > '9' { return false } diff --git a/ipn/localapi/debugderp.go b/ipn/localapi/debugderp.go index af2527ee8..64ff571e5 100644 --- a/ipn/localapi/debugderp.go +++ b/ipn/localapi/debugderp.go @@ -247,7 +247,7 @@ func (h *Handler) serveDebugDERPRegion(w http.ResponseWriter, r *http.Request) { // Next, repeatedly get the server key to see if the node is // behind a load balancer (incorrectly). serverPubKeys := make(map[key.NodePublic]bool) - for i := 0; i < 5; i++ { + for i := range 5 { func() { rc := derphttp.NewRegionClient(fakePrivKey, h.logf, h.netMon, func() *tailcfg.DERPRegion { return &tailcfg.DERPRegion{ diff --git a/ipn/localapi/localapi.go b/ipn/localapi/localapi.go index cef21ddd5..44a840c01 100644 --- a/ipn/localapi/localapi.go +++ b/ipn/localapi/localapi.go @@ -903,7 +903,7 @@ func (h *Handler) serveDebugDialTypes(w http.ResponseWriter, r *http.Request) { } wg.Wait() - for i := 0; i < len(dialers); i++ { + for range len(dialers) { res := <-results fmt.Fprintf(w, "[%s] connected=%v err=%v\n", res.name, res.conn != nil, res.err) if res.conn != nil { diff --git a/ipn/prefs.go b/ipn/prefs.go index 896135ed0..f4edeb2d1 100644 --- a/ipn/prefs.go +++ b/ipn/prefs.go @@ -363,7 +363,7 @@ func applyPrefsEdits(src, dst reflect.Value, mask map[string]reflect.Value) { func maskFields(v reflect.Value) map[string]reflect.Value { mask := make(map[string]reflect.Value) - for i := 0; i < v.NumField(); i++ { + for i := range v.NumField() { f := v.Type().Field(i).Name if !strings.HasSuffix(f, "Set") { continue diff --git a/ipn/prefs_test.go b/ipn/prefs_test.go index 29c3f2479..e9d9cc22e 100644 --- a/ipn/prefs_test.go +++ b/ipn/prefs_test.go @@ -26,7 +26,7 @@ import ( ) func fieldsOf(t reflect.Type) (fields []string) { - for i := 0; i < t.NumField(); i++ { + for i := range t.NumField() { fields = append(fields, t.Field(i).Name) } return @@ -661,7 +661,7 @@ func TestMaskedPrefsFields(t *testing.T) { // ApplyEdits assumes. pt := reflect.TypeFor[Prefs]() mt := reflect.TypeFor[MaskedPrefs]() - for i := 0; i < mt.NumField(); i++ { + for i := range mt.NumField() { name := mt.Field(i).Name if i == 0 { if name != "Prefs" { diff --git a/logtail/filch/filch_test.go b/logtail/filch/filch_test.go index 5c33efbee..6b7b88414 100644 --- a/logtail/filch/filch_test.go +++ b/logtail/filch/filch_test.go @@ -75,11 +75,11 @@ func TestDropOldLogs(t *testing.T) { f := newFilchTest(t, filePrefix, Options{ReplaceStderr: false, MaxFileSize: 1000}) defer f.close(t) // Make filch rotate the logs 3 times - for i := 0; i < tc.write; i++ { + for range tc.write { f.write(t, line1) } // We should only be able to read the last 150 lines - for i := 0; i < tc.read; i++ { + for i := range tc.read { f.read(t, line1) if t.Failed() { t.Logf("could only read %d lines", i) diff --git a/logtail/logtail_test.go b/logtail/logtail_test.go index d3f9a8db1..3ea630406 100644 --- a/logtail/logtail_test.go +++ b/logtail/logtail_test.go @@ -77,7 +77,7 @@ func NewLogtailTestHarness(t *testing.T) (*LogtailTestServer, *Logger) { func TestDrainPendingMessages(t *testing.T) { ts, l := NewLogtailTestHarness(t) - for i := 0; i < logLines; i++ { + for range logLines { l.Write([]byte("log line")) } @@ -540,7 +540,7 @@ func BenchmarkWriteText(b *testing.B) { l.clock = tstime.StdClock{} l.buffer = discardBuffer{} b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { must.Get(l.Write(testdataTextLog)) } } @@ -550,7 +550,7 @@ func BenchmarkWriteJSON(b *testing.B) { l.clock = tstime.StdClock{} l.buffer = discardBuffer{} b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { must.Get(l.Write(testdataJSONLog)) } } diff --git a/metrics/metrics_test.go b/metrics/metrics_test.go index e170c7895..45bf39e56 100644 --- a/metrics/metrics_test.go +++ b/metrics/metrics_test.go @@ -41,7 +41,7 @@ func TestCurrentFileDescriptors(t *testing.T) { // Open some FDs. const extra = 10 - for i := 0; i < extra; i++ { + for i := range extra { f, err := os.Open("/proc/self/stat") if err != nil { t.Fatal(err) @@ -58,7 +58,7 @@ func TestCurrentFileDescriptors(t *testing.T) { func BenchmarkCurrentFileDescriptors(b *testing.B) { b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { _ = CurrentFDs() } } diff --git a/metrics/multilabelmap.go b/metrics/multilabelmap.go index b503b2cf4..c0f312e7d 100644 --- a/metrics/multilabelmap.go +++ b/metrics/multilabelmap.go @@ -61,7 +61,7 @@ func labelString(k any) string { var sb strings.Builder sb.WriteString("{") - for i := 0; i < t.NumField(); i++ { + for i := range t.NumField() { if i > 0 { sb.WriteString(",") } diff --git a/net/art/stride_table_test.go b/net/art/stride_table_test.go index 40700b175..bff2bb7c5 100644 --- a/net/art/stride_table_test.go +++ b/net/art/stride_table_test.go @@ -18,7 +18,7 @@ import ( func TestInversePrefix(t *testing.T) { t.Parallel() - for i := 0; i < 256; i++ { + for i := range 256 { for len := 0; len < 9; len++ { addr := i & (0xFF << (8 - len)) idx := prefixIndex(uint8(addr), len) @@ -32,7 +32,7 @@ func TestInversePrefix(t *testing.T) { func TestHostIndex(t *testing.T) { t.Parallel() - for i := 0; i < 256; i++ { + for i := range 256 { got := hostIndex(uint8(i)) want := prefixIndex(uint8(i), 8) if got != want { @@ -63,7 +63,7 @@ func TestStrideTableInsert(t *testing.T) { } } - for i := 0; i < 256; i++ { + for i := range 256 { addr := uint8(i) slowVal, slowOK := slow.get(addr) fastVal, fastOK := fast.get(addr) @@ -103,7 +103,7 @@ func TestStrideTableInsertShuffled(t *testing.T) { // Order of insertion should not affect the final shape of the stride table. routes2 := append([]slowEntry[int](nil), routes...) // dup so we can print both slices on fail - for i := 0; i < 100; i++ { + for range 100 { rand.Shuffle(len(routes2), func(i, j int) { routes2[i], routes2[j] = routes2[j], routes2[i] }) rt2 := strideTable[int]{} for _, route := range routes2 { @@ -152,7 +152,7 @@ func TestStrideTableDelete(t *testing.T) { t.Fatalf("slowTable has %d entries after deletes, want 50", cnt) } - for i := 0; i < 256; i++ { + for i := range 256 { addr := uint8(i) slowVal, slowOK := slow.get(addr) fastVal, fastOK := fast.get(addr) @@ -188,7 +188,7 @@ func TestStrideTableDeleteShuffle(t *testing.T) { // Order of deletion should not affect the final shape of the stride table. toDelete2 := append([]slowEntry[int](nil), toDelete...) // dup so we can print both slices on fail - for i := 0; i < 100; i++ { + for range 100 { rand.Shuffle(len(toDelete2), func(i, j int) { toDelete2[i], toDelete2[j] = toDelete2[j], toDelete2[i] }) rt2 := strideTable[int]{} for _, route := range routes { @@ -262,7 +262,7 @@ func forStrideCountAndOrdering(b *testing.B, fn func(b *testing.B, routes []slow func BenchmarkStrideTableInsertion(b *testing.B) { forStrideCountAndOrdering(b, func(b *testing.B, routes []slowEntry[int]) { val := 0 - for i := 0; i < b.N; i++ { + for range b.N { var rt strideTable[int] for _, route := range routes { rt.insert(route.addr, route.len, val) @@ -285,7 +285,7 @@ func BenchmarkStrideTableDeletion(b *testing.B) { } b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { rt2 := rt for _, route := range routes { rt2.delete(route.addr, route.len) @@ -311,7 +311,7 @@ func BenchmarkStrideTableGet(b *testing.B) { } b.ResetTimer() - for i := 0; i < b.N; i++ { + for i := range b.N { writeSink, _ = rt.get(uint8(i)) } gets := float64(b.N) diff --git a/net/art/table_test.go b/net/art/table_test.go index 39b76e0af..cdc295c0e 100644 --- a/net/art/table_test.go +++ b/net/art/table_test.go @@ -594,7 +594,7 @@ func TestInsertCompare(t *testing.T) { seenVals4 := map[int]bool{} seenVals6 := map[int]bool{} - for i := 0; i < 10_000; i++ { + for range 10_000 { a := randomAddr() slowVal, slowOK := slow.get(a) fastVal, fastOK := fast.Get(a) @@ -644,12 +644,12 @@ func TestInsertShuffled(t *testing.T) { } }() - for i := 0; i < 10; i++ { + for range 10 { pfxs2 := append([]slowPrefixEntry[int](nil), pfxs...) rand.Shuffle(len(pfxs2), func(i, j int) { pfxs2[i], pfxs2[j] = pfxs2[j], pfxs2[i] }) addrs := make([]netip.Addr, 0, 10_000) - for i := 0; i < 10_000; i++ { + for range 10_000 { addrs = append(addrs, randomAddr()) } @@ -723,7 +723,7 @@ func TestDeleteCompare(t *testing.T) { seenVals4 := map[int]bool{} seenVals6 := map[int]bool{} - for i := 0; i < numProbes; i++ { + for range numProbes { a := randomAddr() slowVal, slowOK := slow.get(a) fastVal, fastOK := fast.Get(a) @@ -789,7 +789,7 @@ func TestDeleteShuffled(t *testing.T) { rt.Delete(pfx.pfx) } - for i := 0; i < 10; i++ { + for range 10 { pfxs2 := append([]slowPrefixEntry[int](nil), pfxs...) toDelete2 := append([]slowPrefixEntry[int](nil), toDelete...) rand.Shuffle(len(toDelete2), func(i, j int) { toDelete2[i], toDelete2[j] = toDelete2[j], toDelete2[i] }) @@ -806,7 +806,7 @@ func TestDeleteShuffled(t *testing.T) { // Diffing a deep tree of tables gives cmp.Diff a nervous breakdown, so // test for equivalence statistically with random probes instead. - for i := 0; i < numProbes; i++ { + for range numProbes { a := randomAddr() val1, ok1 := rt.Get(a) val2, ok2 := rt2.Get(a) @@ -909,7 +909,7 @@ func BenchmarkTableInsertion(b *testing.B) { var startMem, endMem runtime.MemStats runtime.ReadMemStats(&startMem) b.StartTimer() - for i := 0; i < b.N; i++ { + for range b.N { var rt Table[int] for _, route := range routes { rt.Insert(route.pfx, route.val) @@ -944,7 +944,7 @@ func BenchmarkTableDelete(b *testing.B) { var t runningTimer allocs, bytes := getMemCost(func() { - for i := 0; i < b.N; i++ { + for range b.N { var rt Table[int] for _, route := range routes { rt.Insert(route.pfx, route.val) @@ -983,7 +983,7 @@ func BenchmarkTableGet(b *testing.B) { // cost is 16 bytes - presumably due to some amortized costs in // the memory allocator? Either way, empirically 100 iterations // reliably reports the correct cost. - for i := 0; i < 100; i++ { + for range 100 { _ = genAddr() } }) @@ -991,7 +991,7 @@ func BenchmarkTableGet(b *testing.B) { addrBytes /= 100 var t runningTimer allocs, bytes := getMemCost(func() { - for i := 0; i < b.N; i++ { + for range b.N { addr := genAddr() t.Start() writeSink, _ = rt.Get(addr) diff --git a/net/connstats/stats_test.go b/net/connstats/stats_test.go index 0db7996f4..ae0bca8a5 100644 --- a/net/connstats/stats_test.go +++ b/net/connstats/stats_test.go @@ -169,7 +169,7 @@ func Benchmark(b *testing.B) { p := testPacketV4(ipproto.UDP, [4]byte{192, 168, 0, 1}, [4]byte{192, 168, 0, 2}, 123, 456, 789) b.ResetTimer() b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { s := NewStatistics(0, 0, nil) for j := 0; j < 1e3; j++ { s.UpdateTxVirtual(p) @@ -180,7 +180,7 @@ func Benchmark(b *testing.B) { p := testPacketV4(ipproto.UDP, [4]byte{}, [4]byte{}, 0, 0, 789) b.ResetTimer() b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { s := NewStatistics(0, 0, nil) for j := 0; j < 1e3; j++ { binary.BigEndian.PutUint32(p[20:], uint32(j)) // unique port combination @@ -192,7 +192,7 @@ func Benchmark(b *testing.B) { p := testPacketV4(ipproto.UDP, [4]byte{192, 168, 0, 1}, [4]byte{192, 168, 0, 2}, 123, 456, 789) b.ResetTimer() b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { s := NewStatistics(0, 0, nil) var group sync.WaitGroup for j := 0; j < runtime.NumCPU(); j++ { @@ -214,7 +214,7 @@ func Benchmark(b *testing.B) { } b.ResetTimer() b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { s := NewStatistics(0, 0, nil) var group sync.WaitGroup for j := 0; j < runtime.NumCPU(); j++ { diff --git a/net/dns/manager_tcp_test.go b/net/dns/manager_tcp_test.go index 87c0b258e..4883a3b6f 100644 --- a/net/dns/manager_tcp_test.go +++ b/net/dns/manager_tcp_test.go @@ -115,7 +115,7 @@ func TestDNSOverTCP(t *testing.T) { } results := map[dnsname.FQDN]string{} - for i := 0; i < len(wantResults); i++ { + for range len(wantResults) { var respLength uint16 if err := binary.Read(c, binary.BigEndian, &respLength); err != nil { t.Fatalf("reading len: %v", err) diff --git a/net/dns/manager_windows.go b/net/dns/manager_windows.go index 603de8c2e..e46d0562c 100644 --- a/net/dns/manager_windows.go +++ b/net/dns/manager_windows.go @@ -198,7 +198,7 @@ func (m *windowsManager) setHosts(hosts []*HostEntry) error { // This can fail spuriously with an access denied error, so retry it a // few times. - for i := 0; i < 5; i++ { + for range 5 { if err = atomicfile.WriteFile(hostsFile, outB, fileMode); err == nil { return nil } diff --git a/net/dns/recursive/recursive_test.go b/net/dns/recursive/recursive_test.go index 0bfba383a..d47e4cebf 100644 --- a/net/dns/recursive/recursive_test.go +++ b/net/dns/recursive/recursive_test.go @@ -613,7 +613,7 @@ func TestRecursionLimit(t *testing.T) { // Fill out a CNAME chain equal to our recursion limit; we won't get // this far since each CNAME is more than 1 level "deep", but this // ensures that we have more than the limit. - for i := 0; i < maxDepth+1; i++ { + for i := range maxDepth + 1 { curr := fmt.Sprintf("%d-tailscale.com.", i) tailscaleNameservers := &dns.Msg{ diff --git a/net/dns/resolver/debug.go b/net/dns/resolver/debug.go index f334af5c9..da195d49d 100644 --- a/net/dns/resolver/debug.go +++ b/net/dns/resolver/debug.go @@ -67,7 +67,7 @@ func (fl *fwdLog) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "

DNS forwards

") now := time.Now() - for i := 0; i < len(fl.ent); i++ { + for i := range len(fl.ent) { ent := fl.ent[(i+fl.pos)%len(fl.ent)] if ent.Domain == "" { continue diff --git a/net/dns/resolver/forwarder_test.go b/net/dns/resolver/forwarder_test.go index aef9ce50e..e723af620 100644 --- a/net/dns/resolver/forwarder_test.go +++ b/net/dns/resolver/forwarder_test.go @@ -199,7 +199,7 @@ func BenchmarkNameFromQuery(b *testing.B) { } b.ResetTimer() b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { _, err := nameFromQuery(msg) if err != nil { b.Fatal(err) @@ -413,7 +413,7 @@ func makeLargeResponse(tb testing.TB, domain string) (request, response []byte) Class: dns.ClassINET, }) builder.StartAnswers() - for i := 0; i < 120; i++ { + for i := range 120 { builder.AResource(dns.ResourceHeader{ Name: name, Class: dns.ClassINET, diff --git a/net/dns/resolver/tsdns_test.go b/net/dns/resolver/tsdns_test.go index cbef27588..47fecd0cf 100644 --- a/net/dns/resolver/tsdns_test.go +++ b/net/dns/resolver/tsdns_test.go @@ -976,7 +976,7 @@ func BenchmarkFull(b *testing.B) { for _, tt := range tests { b.Run(tt.name, func(b *testing.B) { b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { syncRespond(r, tt.request) } }) diff --git a/net/interfaces/interfaces_darwin_test.go b/net/interfaces/interfaces_darwin_test.go index 6767ec614..bcc508e18 100644 --- a/net/interfaces/interfaces_darwin_test.go +++ b/net/interfaces/interfaces_darwin_test.go @@ -103,7 +103,7 @@ func likelyHomeRouterIPDarwinExec() (ret netip.Addr, netif string, ok bool) { func TestFetchRoutingTable(t *testing.T) { // Issue 1345: this used to be flaky on darwin. - for i := 0; i < 20; i++ { + for range 20 { _, err := fetchRoutingTable() if err != nil { t.Fatal(err) diff --git a/net/interfaces/interfaces_linux_test.go b/net/interfaces/interfaces_linux_test.go index 59249c67d..98f9853f5 100644 --- a/net/interfaces/interfaces_linux_test.go +++ b/net/interfaces/interfaces_linux_test.go @@ -97,7 +97,7 @@ func TestAwsAppRunnerDefaultRouteInterface(t *testing.T) { func BenchmarkDefaultRouteInterface(b *testing.B) { b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { if _, err := DefaultRouteInterface(); err != nil { b.Fatal(err) } diff --git a/net/interfaces/interfaces_windows_test.go b/net/interfaces/interfaces_windows_test.go index 2092dae33..b02a58d03 100644 --- a/net/interfaces/interfaces_windows_test.go +++ b/net/interfaces/interfaces_windows_test.go @@ -7,7 +7,7 @@ import "testing" func BenchmarkGetPACWindows(b *testing.B) { b.ReportAllocs() - for i := 0; i < b.N; i++ { + for i := range b.N { v := getPACWindows() if i == 0 { b.Logf("Got: %q", v) diff --git a/net/packet/packet_test.go b/net/packet/packet_test.go index b340b29a9..4fc804a4f 100644 --- a/net/packet/packet_test.go +++ b/net/packet/packet_test.go @@ -512,7 +512,7 @@ func BenchmarkDecode(b *testing.B) { for _, bench := range benches { b.Run(bench.name, func(b *testing.B) { b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { var p Parsed p.Decode(bench.buf) } @@ -624,7 +624,7 @@ func BenchmarkString(b *testing.B) { var p Parsed p.Decode(bench.buf) b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { sinkString = p.String() } }) diff --git a/net/portmapper/portmapper_test.go b/net/portmapper/portmapper_test.go index e41223dba..d321b720a 100644 --- a/net/portmapper/portmapper_test.go +++ b/net/portmapper/portmapper_test.go @@ -21,7 +21,7 @@ func TestCreateOrGetMapping(t *testing.T) { c := NewClient(t.Logf, nil, nil, new(controlknobs.Knobs), nil) defer c.Close() c.SetLocalPort(1234) - for i := 0; i < 2; i++ { + for i := range 2 { if i > 0 { time.Sleep(100 * time.Millisecond) } @@ -36,7 +36,7 @@ func TestClientProbe(t *testing.T) { } c := NewClient(t.Logf, nil, nil, new(controlknobs.Knobs), nil) defer c.Close() - for i := 0; i < 3; i++ { + for i := range 3 { if i > 0 { time.Sleep(100 * time.Millisecond) } diff --git a/net/portmapper/upnp_test.go b/net/portmapper/upnp_test.go index 87e8c9857..79e05dd99 100644 --- a/net/portmapper/upnp_test.go +++ b/net/portmapper/upnp_test.go @@ -597,7 +597,7 @@ func TestGetUPnPPortMapping(t *testing.T) { firstResponse netip.AddrPort prevPort uint16 ) - for i := 0; i < 2; i++ { + for i := range 2 { sawRequestWithLease.Store(false) res, err := c.Probe(ctx) if err != nil { diff --git a/net/sockstats/sockstats_tsgo_test.go b/net/sockstats/sockstats_tsgo_test.go index 9887d6680..c467c8a70 100644 --- a/net/sockstats/sockstats_tsgo_test.go +++ b/net/sockstats/sockstats_tsgo_test.go @@ -62,7 +62,7 @@ func TestRadioMonitor(t *testing.T) { "400 iterations: 2 sec active, 1 min idle", func(tt *testTime, rm *radioMonitor) { // 400 iterations to ensure values loop back around rm.usage array - for i := 0; i < 400; i++ { + for range 400 { rm.active() tt.Add(1 * time.Second) rm.active() diff --git a/net/stunserver/stunserver_test.go b/net/stunserver/stunserver_test.go index 95b2a8c7b..24a7bb570 100644 --- a/net/stunserver/stunserver_test.go +++ b/net/stunserver/stunserver_test.go @@ -76,7 +76,7 @@ func BenchmarkServerSTUN(b *testing.B) { tx := stun.NewTxID() req := stun.Request(tx) - for i := 0; i < b.N; i++ { + for range b.N { if _, err := cc.WriteToUDP(req, addr); err != nil { b.Fatal(err) } diff --git a/net/tcpinfo/tcpinfo_test.go b/net/tcpinfo/tcpinfo_test.go index a117eb59a..bb3d224ec 100644 --- a/net/tcpinfo/tcpinfo_test.go +++ b/net/tcpinfo/tcpinfo_test.go @@ -45,7 +45,7 @@ func TestRTT(t *testing.T) { // Write a bunch of data to the conn to force TCP session establishment // and a few packets. junkData := bytes.Repeat([]byte("hello world\n"), 1024*1024) - for i := 0; i < 10; i++ { + for i := range 10 { if _, err := conn.Write(junkData); err != nil { t.Fatalf("error writing junk data [%d]: %v", i, err) } diff --git a/net/tsaddr/tsaddr_test.go b/net/tsaddr/tsaddr_test.go index 7cc1a3881..7944545c7 100644 --- a/net/tsaddr/tsaddr_test.go +++ b/net/tsaddr/tsaddr_test.go @@ -99,7 +99,7 @@ var sinkIP netip.Addr func BenchmarkTailscaleServiceAddr(b *testing.B) { b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { sinkIP = TailscaleServiceIP() } } diff --git a/net/tshttpproxy/tshttpproxy_test.go b/net/tshttpproxy/tshttpproxy_test.go index 5b9362d2c..97f8c1f8b 100644 --- a/net/tshttpproxy/tshttpproxy_test.go +++ b/net/tshttpproxy/tshttpproxy_test.go @@ -64,7 +64,7 @@ func TestProxyFromEnvironment_setNoProxyUntil(t *testing.T) { os.Setenv("HTTPS_PROXY", fakeProxyEnv) req := &http.Request{URL: must.Get(url.Parse("https://example.com/"))} - for i := 0; i < 3; i++ { + for i := range 3 { switch i { case 1: setNoProxyUntil(time.Minute) diff --git a/net/tstun/wrap_test.go b/net/tstun/wrap_test.go index 12da00c64..c959e0dc8 100644 --- a/net/tstun/wrap_test.go +++ b/net/tstun/wrap_test.go @@ -222,7 +222,7 @@ func TestReadAndInject(t *testing.T) { var seen = make(map[string]bool) sizes := make([]int, 1) // We expect the same packets back, in no particular order. - for i := 0; i < len(written)+len(injected); i++ { + for i := range len(written) + len(injected) { packet := buf[:] buffs := [][]byte{packet} numPackets, err := tun.Read(buffs, sizes, 0) @@ -283,7 +283,7 @@ func TestWriteAndInject(t *testing.T) { seen := make(map[string]bool) // We expect the same packets back, in no particular order. - for i := 0; i < len(written)+len(injected); i++ { + for i := range len(written) + len(injected) { packet := <-chtun.Inbound got := string(packet) t.Logf("read %d: got %s", i, got) @@ -470,7 +470,7 @@ func BenchmarkWrite(b *testing.B) { defer tun.Close() packet := [][]byte{udp4("5.6.7.8", "1.2.3.4", 89, 89)} - for i := 0; i < b.N; i++ { + for range b.N { _, err := ftun.Write(packet, 0) if err != nil { b.Errorf("err = %v; want nil", err) @@ -902,7 +902,7 @@ func TestCaptureHook(t *testing.T) { pkt: []byte("InjectOutboundPacketBuffer"), }, } - for i := 0; i < len(want); i++ { + for i := range len(want) { want[i].now = now } if !reflect.DeepEqual(captured, want) { diff --git a/paths/paths_unix.go b/paths/paths_unix.go index 2885cd978..6a2b28733 100644 --- a/paths/paths_unix.go +++ b/paths/paths_unix.go @@ -45,7 +45,7 @@ func stateFileUnix() string { } try := path - for i := 0; i < 3; i++ { // check writability of the file, /var/lib/tailscale, and /var/lib + for range 3 { // check writability of the file, /var/lib/tailscale, and /var/lib err := unix.Access(try, unix.O_RDWR) if err == nil { return path diff --git a/portlist/portlist_linux_test.go b/portlist/portlist_linux_test.go index 2b8c8cc1d..24635fae2 100644 --- a/portlist/portlist_linux_test.go +++ b/portlist/portlist_linux_test.go @@ -114,7 +114,7 @@ func BenchmarkParsePorts(b *testing.B) { 1: 00000000000000000000000000000000:1F91 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 1000 0 142240557 1 0000000000000000 100 0 0 10 0 2: 00000000000000000000000000000000:0016 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 34064 1 0000000000000000 100 0 0 10 0 `) - for i := 0; i < 50000; i++ { + for range 50000 { contents.WriteString(" 3: 69050120005716BC64906EBE009ECD4D:D506 0047062600000000000000006E171268:01BB 01 00000000:00000000 02:0000009E 00000000 1000 0 151042856 2 0000000000000000 21 4 28 10 -1\n") } @@ -123,7 +123,7 @@ func BenchmarkParsePorts(b *testing.B) { r := bytes.NewReader(contents.Bytes()) br := bufio.NewReader(&contents) b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { r.Seek(0, io.SeekStart) br.Reset(r) err := li.parseProcNetFile(br, "tcp6") @@ -142,7 +142,7 @@ func BenchmarkFindProcessNames(b *testing.B) { need := map[string]*portMeta{ "something-we'll-never-find": new(portMeta), } - for i := 0; i < b.N; i++ { + for range b.N { if err := li.findProcessNames(need); err != nil { b.Fatal(err) } diff --git a/portlist/portlist_test.go b/portlist/portlist_test.go index 14cc490f7..34277fdba 100644 --- a/portlist/portlist_test.go +++ b/portlist/portlist_test.go @@ -205,7 +205,7 @@ func benchmarkGetList(b *testing.B, incremental bool) { b.Skip(p.initErr) } b.Cleanup(func() { p.Close() }) - for i := 0; i < b.N; i++ { + for range b.N { pl, err := p.getList() if err != nil { b.Fatal(err) diff --git a/prober/derp_test.go b/prober/derp_test.go index 138852b91..8afbffac7 100644 --- a/prober/derp_test.go +++ b/prober/derp_test.go @@ -186,7 +186,7 @@ func Test_packetsForSize(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { hashes := make(map[string]int) - for i := 0; i < 5; i++ { + for range 5 { pkts := packetsForSize(int64(tt.size)) if len(pkts) != tt.wantPackets { t.Errorf("packetsForSize(%d) got %d packets, want %d", tt.size, len(pkts), tt.wantPackets) diff --git a/prober/prober_test.go b/prober/prober_test.go index a97003a63..af645ef00 100644 --- a/prober/prober_test.go +++ b/prober/prober_test.go @@ -155,7 +155,7 @@ func TestProberRun(t *testing.T) { const startingProbes = 100 var probes []*Probe - for i := 0; i < startingProbes; i++ { + for i := range startingProbes { probes = append(probes, p.Run(fmt.Sprintf("probe%d", i), probeInterval, nil, FuncProbe(func(context.Context) error { mu.Lock() defer mu.Unlock() diff --git a/safesocket/basic_test.go b/safesocket/basic_test.go index 31c54ac7b..71422b8bc 100644 --- a/safesocket/basic_test.go +++ b/safesocket/basic_test.go @@ -76,7 +76,7 @@ func TestBasics(t *testing.T) { errs <- nil }() - for i := 0; i < 2; i++ { + for range 2 { if err := <-errs; err != nil { t.Fatal(err) } diff --git a/safesocket/pipe_windows_test.go b/safesocket/pipe_windows_test.go index 2080d1934..054781f23 100644 --- a/safesocket/pipe_windows_test.go +++ b/safesocket/pipe_windows_test.go @@ -99,7 +99,7 @@ func TestExpectedWindowsTypes(t *testing.T) { errs <- nil }() - for i := 0; i < 2; i++ { + for range 2 { if err := <-errs; err != nil { t.Fatal(err) } diff --git a/smallzstd/zstd_test.go b/smallzstd/zstd_test.go index 489c518ae..d1225bfac 100644 --- a/smallzstd/zstd_test.go +++ b/smallzstd/zstd_test.go @@ -54,7 +54,7 @@ func benchEncoder(b *testing.B, mk func() (*zstd.Encoder, error)) { } b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { e.EncodeAll(in, out) } } @@ -66,7 +66,7 @@ func benchEncoderWithConstruction(b *testing.B, mk func() (*zstd.Encoder, error) out := make([]byte, 0, 10<<10) // 10kiB b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { e, err := mk() if err != nil { b.Fatalf("making encoder: %v", err) @@ -88,7 +88,7 @@ func benchDecoder(b *testing.B, mk func() (*zstd.Decoder, error)) { } b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { d.DecodeAll(in, out) } } @@ -100,7 +100,7 @@ func benchDecoderWithConstruction(b *testing.B, mk func() (*zstd.Decoder, error) out := make([]byte, 0, 10<<10) b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { d, err := mk() if err != nil { b.Fatalf("creating decoder: %v", err) diff --git a/ssh/tailssh/tailssh_test.go b/ssh/tailssh/tailssh_test.go index d193f55e3..06a87f6a6 100644 --- a/ssh/tailssh/tailssh_test.go +++ b/ssh/tailssh/tailssh_test.go @@ -1016,7 +1016,7 @@ func TestPublicKeyFetching(t *testing.T) { pubKeyHTTPClient: ts.Client(), timeNow: clock.Now, } - for i := 0; i < 2; i++ { + for range 2 { got, err := srv.fetchPublicKeysURL(keys + "/alice.keys") if err != nil { t.Fatal(err) diff --git a/syncs/syncs_test.go b/syncs/syncs_test.go index 4e99979d6..a9ed67a41 100644 --- a/syncs/syncs_test.go +++ b/syncs/syncs_test.go @@ -45,7 +45,7 @@ func TestWaitGroupChan(t *testing.T) { func TestClosedChan(t *testing.T) { ch := ClosedChan() - for i := 0; i < 2; i++ { + for range 2 { select { case <-ch: default: diff --git a/tailcfg/tailcfg_test.go b/tailcfg/tailcfg_test.go index 2940084d7..fa8a27479 100644 --- a/tailcfg/tailcfg_test.go +++ b/tailcfg/tailcfg_test.go @@ -23,7 +23,7 @@ import ( ) func fieldsOf(t reflect.Type) (fields []string) { - for i := 0; i < t.NumField(); i++ { + for i := range t.NumField() { fields = append(fields, t.Field(i).Name) } return diff --git a/tempfork/heap/heap_test.go b/tempfork/heap/heap_test.go index c5e96a553..ddaf47a7f 100644 --- a/tempfork/heap/heap_test.go +++ b/tempfork/heap/heap_test.go @@ -118,7 +118,7 @@ func Test(t *testing.T) { func TestRemove0(t *testing.T) { h := new(myHeap[int]) - for i := 0; i < 10; i++ { + for i := range 10 { h.Push(i) } h.verify(t, 0) @@ -135,7 +135,7 @@ func TestRemove0(t *testing.T) { func TestRemove1(t *testing.T) { h := new(myHeap[int]) - for i := 0; i < 10; i++ { + for i := range 10 { h.Push(i) } h.verify(t, 0) @@ -153,7 +153,7 @@ func TestRemove2(t *testing.T) { N := 10 h := new(myHeap[int]) - for i := 0; i < N; i++ { + for i := range N { h.Push(i) } h.verify(t, 0) @@ -167,7 +167,7 @@ func TestRemove2(t *testing.T) { if len(m) != N { t.Errorf("len(m) = %d; want %d", len(m), N) } - for i := 0; i < len(m); i++ { + for i := range len(m) { if !m[i] { t.Errorf("m[%d] doesn't exist", i) } @@ -177,7 +177,7 @@ func TestRemove2(t *testing.T) { func BenchmarkDup(b *testing.B) { const n = 10000 h := make(myHeap[int], 0, n) - for i := 0; i < b.N; i++ { + for range b.N { for j := 0; j < n; j++ { Push[int](&h, 0) // all elements are the same } diff --git a/tka/chaintest_test.go b/tka/chaintest_test.go index f0ccf422c..5811f9c83 100644 --- a/tka/chaintest_test.go +++ b/tka/chaintest_test.go @@ -209,7 +209,7 @@ func (c *testChain) buildChain() { // in O(n+1) where n is the number of AUMs. c.AUMs = make(map[string]AUM, len(c.Nodes)) c.AUMHashes = make(map[string]AUMHash, len(c.Nodes)) - for i := 0; i < len(c.Nodes)+1; i++ { + for range len(c.Nodes) + 1 { if len(pending) == 0 { return } diff --git a/tka/sig_test.go b/tka/sig_test.go index 038ec5f88..819b6aa83 100644 --- a/tka/sig_test.go +++ b/tka/sig_test.go @@ -143,7 +143,7 @@ func TestSigNested_DeepNesting(t *testing.T) { outer := nestedSig var lastNodeKey key.NodePrivate - for i := 0; i < 15; i++ { // 15 = max nesting level for CBOR + for range 15 { // 15 = max nesting level for CBOR lastNodeKey = key.NewNode() nodeKeyPub, _ := lastNodeKey.Public().MarshalBinary() diff --git a/tka/sync.go b/tka/sync.go index b6f3f31b0..6131f54d0 100644 --- a/tka/sync.go +++ b/tka/sync.go @@ -142,7 +142,7 @@ func computeSyncIntersection(storage Chonk, localOffer, remoteOffer SyncOffer) ( if hasRemoteHead { curs := localOffer.Head - for i := 0; i < maxSyncHeadIntersectionIter; i++ { + for range maxSyncHeadIntersectionIter { parent, err := storage.AUM(curs) if err != nil { if err != os.ErrNotExist { diff --git a/tka/tailchonk.go b/tka/tailchonk.go index 02f06c0ba..32d2215de 100644 --- a/tka/tailchonk.go +++ b/tka/tailchonk.go @@ -587,7 +587,7 @@ func markActiveChain(storage Chonk, verdict map[AUMHash]retainState, minChain in return AUMHash{}, err } - for i := 0; i < minChain; i++ { + for i := range minChain { h := next.Hash() verdict[h] |= retainStateActive diff --git a/tka/tka.go b/tka/tka.go index 61bee804b..22145a008 100644 --- a/tka/tka.go +++ b/tka/tka.go @@ -213,7 +213,7 @@ func fastForwardWithAdvancer( curs := nextAUM state := startState - for i := 0; i < maxIter; i++ { + for range maxIter { if done != nil && done(curs, state) { return curs, state, nil } diff --git a/tsnet/tsnet_test.go b/tsnet/tsnet_test.go index c6be4b102..85c3fa44f 100644 --- a/tsnet/tsnet_test.go +++ b/tsnet/tsnet_test.go @@ -730,7 +730,7 @@ func TestCapturePcap(t *testing.T) { const pcapHeaderSize = 24 // there is a lag before the io.Copy writes a packet to the pcap files - for i := 0; i < (timeLimit * 10); i++ { + for range timeLimit * 10 { time.Sleep(100 * time.Millisecond) if (fileSize(s1Pcap) > pcapHeaderSize) && (fileSize(s2Pcap) > pcapHeaderSize) { break diff --git a/tstest/clock_test.go b/tstest/clock_test.go index 93defe7ff..d5816564a 100644 --- a/tstest/clock_test.go +++ b/tstest/clock_test.go @@ -153,7 +153,7 @@ func TestZeroInitClock(t *testing.T) { t.Errorf("clock has step %v, want 0", step) } - for i := 0; i < 10; i++ { + for i := range 10 { if got := clock.Now(); !got.Equal(start) { t.Errorf("step %v: clock.Now() = %v, want %v", i, got, start) } diff --git a/tstest/integration/vms/vm_setup_test.go b/tstest/integration/vms/vm_setup_test.go index 0695df268..0c6901014 100644 --- a/tstest/integration/vms/vm_setup_test.go +++ b/tstest/integration/vms/vm_setup_test.go @@ -50,7 +50,7 @@ func (vm *vmInstance) running() bool { func (vm *vmInstance) waitStartup(t *testing.T) { t.Helper() - for i := 0; i < 100; i++ { + for range 100 { if vm.running() { break } diff --git a/tstest/integration/vms/vms_steps_test.go b/tstest/integration/vms/vms_steps_test.go index 50c578968..94e4114f0 100644 --- a/tstest/integration/vms/vms_steps_test.go +++ b/tstest/integration/vms/vms_steps_test.go @@ -23,7 +23,7 @@ func retry(t *testing.T, fn func() error) { t.Helper() const tries = 3 var err error - for i := 0; i < tries; i++ { + for i := range tries { err = fn() if err != nil { t.Logf("%dth invocation failed, trying again: %v", i, err) diff --git a/tstest/integration/vms/vms_test.go b/tstest/integration/vms/vms_test.go index e7167c2b8..6d73a3f78 100644 --- a/tstest/integration/vms/vms_test.go +++ b/tstest/integration/vms/vms_test.go @@ -321,7 +321,7 @@ func (h *Harness) setupSSHShell(t *testing.T, d Distro, ipm ipMapping) (*ssh.Cli // don't use socket activation. const maxRetries = 5 var working bool - for i := 0; i < maxRetries; i++ { + for range maxRetries { cli, err := ssh.Dial("tcp", hostport, ccfg) if err == nil { working = true diff --git a/tstest/natlab/natlab_test.go b/tstest/natlab/natlab_test.go index 4e9a48582..843883732 100644 --- a/tstest/natlab/natlab_test.go +++ b/tstest/natlab/natlab_test.go @@ -17,7 +17,7 @@ import ( func TestAllocIPs(t *testing.T) { n := NewInternet() saw := map[netip.Addr]bool{} - for i := 0; i < 255; i++ { + for range 255 { for _, f := range []func(*Interface) netip.Addr{n.allocIPv4, n.allocIPv6} { ip := f(nil) if saw[ip] { diff --git a/tstest/resource.go b/tstest/resource.go index 4ca9fc928..a3c292094 100644 --- a/tstest/resource.go +++ b/tstest/resource.go @@ -33,7 +33,7 @@ func ResourceCheck(tb testing.TB) { return } // Goroutines might be still exiting. - for i := 0; i < 300; i++ { + for range 300 { if runtime.NumGoroutine() <= startN { return } diff --git a/tstime/jitter_test.go b/tstime/jitter_test.go index 93b90ccc0..579287bda 100644 --- a/tstime/jitter_test.go +++ b/tstime/jitter_test.go @@ -14,7 +14,7 @@ func TestRandomDurationBetween(t *testing.T) { } const min = 1 * time.Second const max = 10 * time.Second - for i := 0; i < 500; i++ { + for range 500 { if got := RandomDurationBetween(min, max); got < min || got >= max { t.Fatalf("%v (%d) out of range", got, got) } diff --git a/tstime/mono/mono_test.go b/tstime/mono/mono_test.go index f425abe9a..67a8614ba 100644 --- a/tstime/mono/mono_test.go +++ b/tstime/mono/mono_test.go @@ -50,14 +50,14 @@ func TestJSONRoundtrip(t *testing.T) { func BenchmarkMonoNow(b *testing.B) { b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { Now() } } func BenchmarkTimeNow(b *testing.B) { b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { time.Now() } } diff --git a/tstime/rate/rate_test.go b/tstime/rate/rate_test.go index 3099cbae8..dc3f9e84b 100644 --- a/tstime/rate/rate_test.go +++ b/tstime/rate/rate_test.go @@ -7,8 +7,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build go1.7 - package rate import ( @@ -138,7 +136,7 @@ func TestSimultaneousRequests(t *testing.T) { } wg.Add(numRequests) - for i := 0; i < numRequests; i++ { + for range numRequests { go f() } wg.Wait() diff --git a/tstime/rate/value_test.go b/tstime/rate/value_test.go index dd9a803b1..a26442650 100644 --- a/tstime/rate/value_test.go +++ b/tstime/rate/value_test.go @@ -43,7 +43,7 @@ func TestValue(t *testing.T) { c := qt.New(t) var v Value var now mono.Time - for i := 0; i < numStep; i++ { + for range numStep { v.addNow(now, float64(step)) now += step } @@ -232,7 +232,7 @@ func stats(fs []float64) (mean, stddev float64) { func BenchmarkValue(b *testing.B) { b.ReportAllocs() v := Value{HalfLife: time.Second} - for i := 0; i < b.N; i++ { + for range b.N { v.Add(1) } } diff --git a/tsweb/tsweb_test.go b/tsweb/tsweb_test.go index cd3c99fce..4f4f03aff 100644 --- a/tsweb/tsweb_test.go +++ b/tsweb/tsweb_test.go @@ -521,7 +521,7 @@ func BenchmarkLogNot200(b *testing.B) { h := StdHandler(rh, HandlerOptions{QuietLoggingIfSuccessful: true}) req := httptest.NewRequest("GET", "/", nil) rw := new(httptest.ResponseRecorder) - for i := 0; i < b.N; i++ { + for range b.N { *rw = httptest.ResponseRecorder{} h.ServeHTTP(rw, req) } @@ -536,7 +536,7 @@ func BenchmarkLog(b *testing.B) { h := StdHandler(rh, HandlerOptions{}) req := httptest.NewRequest("GET", "/", nil) rw := new(httptest.ResponseRecorder) - for i := 0; i < b.N; i++ { + for range b.N { *rw = httptest.ResponseRecorder{} h.ServeHTTP(rw, req) } diff --git a/types/ipproto/ipproto_test.go b/types/ipproto/ipproto_test.go index 1ebeeee9f..102b79cff 100644 --- a/types/ipproto/ipproto_test.go +++ b/types/ipproto/ipproto_test.go @@ -49,7 +49,7 @@ func TestAcceptedNamesContainsPreferredNames(t *testing.T) { } func TestProtoTextEncodingRoundTrip(t *testing.T) { - for i := 0; i < 256; i++ { + for i := range 256 { text := must.Get(Proto(i).MarshalText()) var p Proto must.Do(p.UnmarshalText(text)) @@ -67,7 +67,7 @@ func TestProtoUnmarshalText(t *testing.T) { t.Fatalf("empty input, got err=%v, p=%v, want nil, 0", err, p) } - for i := 0; i < 256; i++ { + for i := range 256 { var p Proto must.Do(p.UnmarshalText([]byte(fmt.Sprintf("%d", i)))) if got, want := p, Proto(i); got != want { @@ -93,7 +93,7 @@ func TestProtoUnmarshalText(t *testing.T) { } func TestProtoMarshalText(t *testing.T) { - for i := 0; i < 256; i++ { + for i := range 256 { text := must.Get(Proto(i).MarshalText()) if wantName, ok := preferredNames[Proto(i)]; ok { @@ -110,7 +110,7 @@ func TestProtoMarshalText(t *testing.T) { } func TestProtoMarshalJSON(t *testing.T) { - for i := 0; i < 256; i++ { + for i := range 256 { j := must.Get(Proto(i).MarshalJSON()) if got, want := string(j), fmt.Sprintf(`%d`, i); got != want { t.Errorf("Proto(%d).MarshalJSON() = %q, want %q", i, got, want) @@ -121,7 +121,7 @@ func TestProtoMarshalJSON(t *testing.T) { func TestProtoUnmarshalJSON(t *testing.T) { var p Proto - for i := 0; i < 256; i++ { + for i := range 256 { j := []byte(fmt.Sprintf(`%d`, i)) must.Do(json.Unmarshal(j, &p)) if got, want := p, Proto(i); got != want { diff --git a/types/key/node_test.go b/types/key/node_test.go index edbd9e927..80a2dadf9 100644 --- a/types/key/node_test.go +++ b/types/key/node_test.go @@ -162,7 +162,7 @@ func TestChallenge(t *testing.T) { func TestShard(t *testing.T) { const N = 1_000 var shardCount [256]int - for i := 0; i < N; i++ { + for range N { shardCount[NewNode().Public().Shard()]++ } e := float64(N) / 256 // expected diff --git a/types/key/util_test.go b/types/key/util_test.go index accef8ddd..4d6f82422 100644 --- a/types/key/util_test.go +++ b/types/key/util_test.go @@ -22,7 +22,7 @@ func TestRand(t *testing.T) { } func TestClamp25519Private(t *testing.T) { - for i := 0; i < 100; i++ { + for range 100 { var k [32]byte rand(k[:]) clamp25519Private(k[:]) diff --git a/types/lazy/sync_test.go b/types/lazy/sync_test.go index ac92c4914..d7bc913f7 100644 --- a/types/lazy/sync_test.go +++ b/types/lazy/sync_test.go @@ -89,7 +89,7 @@ func TestSyncValueConcurrent(t *testing.T) { routines = 10000 ) wg.Add(routines) - for i := 0; i < routines; i++ { + for range routines { go func() { defer wg.Done() // Every goroutine waits for the go signal, so that more of them diff --git a/types/logger/logger_test.go b/types/logger/logger_test.go index 2d06ab851..52c1d3900 100644 --- a/types/logger/logger_test.go +++ b/types/logger/logger_test.go @@ -70,7 +70,7 @@ func TestRateLimiter(t *testing.T) { lgtest := logTester(want, t, &testsRun) lg := RateLimitedFnWithClock(lgtest, 1*time.Minute, 2, 50, nowf) var prefixed Logf - for i := 0; i < 10; i++ { + for i := range 10 { lg("boring string with constant formatting %s", "(constant)") lg("templated format string no. %d", i) if i == 4 { @@ -121,7 +121,7 @@ func TestLogOnChange(t *testing.T) { lgtest := logTester(want, t, &testsRun) lg := LogOnChange(lgtest, 5*time.Second, timeNow) - for i := 0; i < 10; i++ { + for range 10 { lg("%s", "1 2 3 4 5 6") } lg("1 2 3 4 5 7") diff --git a/types/netmap/netmap.go b/types/netmap/netmap.go index de187f5f8..13806b5a8 100644 --- a/types/netmap/netmap.go +++ b/types/netmap/netmap.go @@ -137,7 +137,7 @@ func (nm *NetworkMap) PeerByTailscaleIP(ip netip.Addr) (peer tailcfg.NodeView, o } for _, n := range nm.Peers { ad := n.Addresses() - for i := 0; i < ad.Len(); i++ { + for i := range ad.Len() { a := ad.At(i) if a.Addr() == ip { return n, true diff --git a/types/netmap/nodemut.go b/types/netmap/nodemut.go index be224efed..46fbaefc6 100644 --- a/types/netmap/nodemut.go +++ b/types/netmap/nodemut.go @@ -73,7 +73,7 @@ func (m NodeMutationLastSeen) Apply(n *tailcfg.Node) { var peerChangeFields = sync.OnceValue(func() []reflect.StructField { var fields []reflect.StructField rt := reflect.TypeFor[tailcfg.PeerChange]() - for i := 0; i < rt.NumField(); i++ { + for i := range rt.NumField() { fields = append(fields, rt.Field(i)) } return fields diff --git a/types/netmap/nodemut_test.go b/types/netmap/nodemut_test.go index ef20ca6f5..374f8623a 100644 --- a/types/netmap/nodemut_test.go +++ b/types/netmap/nodemut_test.go @@ -44,7 +44,7 @@ func TestMapResponseContainsNonPatchFields(t *testing.T) { } rt := reflect.TypeFor[tailcfg.MapResponse]() - for i := 0; i < rt.NumField(); i++ { + for i := range rt.NumField() { f := rt.Field(i) var want bool diff --git a/types/persist/persist_test.go b/types/persist/persist_test.go index 99128f891..920f0c448 100644 --- a/types/persist/persist_test.go +++ b/types/persist/persist_test.go @@ -12,7 +12,7 @@ import ( ) func fieldsOf(t reflect.Type) (fields []string) { - for i := 0; i < t.NumField(); i++ { + for i := range t.NumField() { if name := t.Field(i).Name; name != "_" { fields = append(fields, name) } diff --git a/types/views/views.go b/types/views/views.go index 0032bd462..7ff0234a4 100644 --- a/types/views/views.go +++ b/types/views/views.go @@ -262,7 +262,7 @@ func (v Slice[T]) AsSlice() []T { // // As it runs in O(n) time, use with care. func (v Slice[T]) IndexFunc(f func(T) bool) int { - for i := 0; i < v.Len(); i++ { + for i := range v.Len() { if f(v.At(i)) { return i } diff --git a/types/views/views_test.go b/types/views/views_test.go index 933d72395..96c1a8b9c 100644 --- a/types/views/views_test.go +++ b/types/views/views_test.go @@ -24,7 +24,7 @@ type viewStruct struct { func BenchmarkSliceIteration(b *testing.B) { var data []viewStruct - for i := 0; i < 10000; i++ { + for i := range 10000 { data = append(data, viewStruct{Int: i}) } b.ResetTimer() @@ -33,7 +33,7 @@ func BenchmarkSliceIteration(b *testing.B) { dv := SliceOf(data) for it := 0; it < b.N; it++ { sum := 0 - for i := 0; i < dv.Len(); i++ { + for i := range dv.Len() { sum += dv.At(i).Int } } @@ -181,7 +181,7 @@ func TestSliceMapKey(t *testing.T) { } wantDiff := []Slice[string]{nilSlice, empty, sub1, sub2, sub3, u3} - for i := 0; i < len(wantDiff); i++ { + for i := range len(wantDiff) { for j := i + 1; j < len(wantDiff); j++ { si, sj := wantDiff[i], wantDiff[j] ki, kj := wantDiff[i].MapKey(), wantDiff[j].MapKey() diff --git a/util/codegen/codegen.go b/util/codegen/codegen.go index cf848b1d2..6c2b3c71e 100644 --- a/util/codegen/codegen.go +++ b/util/codegen/codegen.go @@ -201,7 +201,7 @@ func AssertStructUnchanged(t *types.Struct, tname, ctx string, it *ImportTracker w("// A compilation failure here means this code must be regenerated, with the command at the top of this file.") w("var _%s%sNeedsRegeneration = %s(struct {", tname, ctx, tname) - for i := 0; i < t.NumFields(); i++ { + for i := range t.NumFields() { st := t.Field(i) fname := st.Name() ft := t.Field(i).Type() @@ -253,7 +253,7 @@ func ContainsPointers(typ types.Type) bool { case *types.Slice: return true case *types.Struct: - for i := 0; i < ft.NumFields(); i++ { + for i := range ft.NumFields() { if ContainsPointers(ft.Field(i).Type()) { return true } diff --git a/util/cstruct/cstruct_test.go b/util/cstruct/cstruct_test.go index 90e21841b..5a75f3385 100644 --- a/util/cstruct/cstruct_test.go +++ b/util/cstruct/cstruct_test.go @@ -78,7 +78,7 @@ func TestDecoder(t *testing.T) { dec := func(n int) *Decoder { // Make a buffer of the exact size that consists of 0xff bytes buf := make([]byte, n) - for i := 0; i < n; i++ { + for i := range n { buf[i] = 0xff } @@ -108,7 +108,7 @@ func TestDecoder(t *testing.T) { dec := func(n int) *Decoder { // Make a buffer that's too small and contains arbitrary bytes buf := make([]byte, n-1) - for i := 0; i < n-1; i++ { + for i := range n - 1 { buf[i] = 0xAD } diff --git a/util/deephash/deephash.go b/util/deephash/deephash.go index 1993649e3..29f47e338 100644 --- a/util/deephash/deephash.go +++ b/util/deephash/deephash.go @@ -47,7 +47,7 @@ // // var big *Item = ... // some large data structure that is slow to hash // var manyBig []*Item -// for i := 0; i < 1000; i++ { +// for i := range 1000 { // manyBig = append(manyBig, &big) // } // deephash.Hash(manyBig) @@ -208,7 +208,7 @@ type Sum struct { } func (s1 *Sum) xor(s2 Sum) { - for i := 0; i < sha256.Size; i++ { + for i := range sha256.Size { s1.sum[i] ^= s2.sum[i] } } @@ -492,7 +492,7 @@ func makeArrayHasher(t reflect.Type) typeHasherFunc { nb := t.Elem().Size() // byte size of each array element return func(h *hasher, p pointer) { once.Do(init) - for i := 0; i < n; i++ { + for i := range n { hashElem(h, p.arrayIndex(i, nb)) } } @@ -545,7 +545,7 @@ func makeSliceHasher(t reflect.Type) typeHasherFunc { h.HashUint8(1) // indicates visiting slice n := p.sliceLen() h.HashUint64(uint64(n)) - for i := 0; i < n; i++ { + for i := range n { pe := pa.arrayIndex(i, nb) hashElem(h, pe) } diff --git a/util/deephash/deephash_test.go b/util/deephash/deephash_test.go index 52b874f89..51b0bfa10 100644 --- a/util/deephash/deephash_test.go +++ b/util/deephash/deephash_test.go @@ -202,7 +202,7 @@ func TestDeepHash(t *testing.T) { v := getVal() hash1 := Hash(v) t.Logf("hash: %v", hash1) - for i := 0; i < 20; i++ { + for range 20 { v := getVal() hash2 := Hash(v) if hash1 != hash2 { @@ -760,7 +760,7 @@ var sink Sum func BenchmarkHash(b *testing.B) { b.ReportAllocs() v := getVal() - for i := 0; i < b.N; i++ { + for range b.N { sink = Hash(v) } } @@ -809,14 +809,14 @@ var filterRules = []tailcfg.FilterRule{ func BenchmarkHashPacketFilter(b *testing.B) { b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { sink = Hash(&filterRules) } } func TestHashMapAcyclic(t *testing.T) { m := map[int]string{} - for i := 0; i < 100; i++ { + for i := range 100 { m[i] = fmt.Sprint(i) } got := map[string]bool{} @@ -824,7 +824,7 @@ func TestHashMapAcyclic(t *testing.T) { hb := &hashBuffer{Hash: sha256.New()} hash := lookupTypeHasher(reflect.TypeFor[map[int]string]()) - for i := 0; i < 20; i++ { + for range 20 { va := reflect.ValueOf(&m).Elem() hb.Reset() h := new(hasher) @@ -862,7 +862,7 @@ func TestPrintArray(t *testing.T) { func BenchmarkHashMapAcyclic(b *testing.B) { b.ReportAllocs() m := map[int]string{} - for i := 0; i < 100; i++ { + for i := range 100 { m[i] = fmt.Sprint(i) } @@ -873,7 +873,7 @@ func BenchmarkHashMapAcyclic(b *testing.B) { h := new(hasher) h.Block512.Hash = hb - for i := 0; i < b.N; i++ { + for range b.N { h.Reset() hash(h, pointerOf(va.Addr())) } @@ -883,14 +883,14 @@ func BenchmarkTailcfgNode(b *testing.B) { b.ReportAllocs() node := new(tailcfg.Node) - for i := 0; i < b.N; i++ { + for range b.N { sink = Hash(node) } } func TestExhaustive(t *testing.T) { seen := make(map[Sum]bool) - for i := 0; i < 100000; i++ { + for i := range 100000 { s := Hash(&i) if seen[s] { t.Fatalf("hash collision %v", i) @@ -971,7 +971,7 @@ func BenchmarkHashArray(b *testing.B) { } x := &T{X: [32]byte{1: 1, 2: 2, 3: 3, 4: 4}} - for i := 0; i < b.N; i++ { + for range b.N { sink = Hash(x) } } @@ -1134,7 +1134,7 @@ func BenchmarkAppendTo(b *testing.B) { hashBuf := make([]byte, 0, 100) b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { hashBuf = h.AppendTo(hashBuf[:0]) } } diff --git a/util/dnsname/dnsname.go b/util/dnsname/dnsname.go index 6481a5867..dde0baaed 100644 --- a/util/dnsname/dnsname.go +++ b/util/dnsname/dnsname.go @@ -40,7 +40,7 @@ func ToFQDN(s string) (FQDN, error) { } st := 0 - for i := 0; i < len(s); i++ { + for i := range len(s) { if s[i] != '.' { continue } diff --git a/util/dnsname/dnsname_test.go b/util/dnsname/dnsname_test.go index 563959d33..719e28be3 100644 --- a/util/dnsname/dnsname_test.go +++ b/util/dnsname/dnsname_test.go @@ -224,7 +224,7 @@ func BenchmarkToFQDN(b *testing.B) { for _, test := range tests { b.Run(test, func(b *testing.B) { b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { sinkFQDN, _ = ToFQDN(test) } }) diff --git a/util/expvarx/expvarx_test.go b/util/expvarx/expvarx_test.go index 16a989928..74ec152f4 100644 --- a/util/expvarx/expvarx_test.go +++ b/util/expvarx/expvarx_test.go @@ -113,7 +113,7 @@ func TestSafeFuncSlowOnSlow(t *testing.T) { slowValue.Store(v) }) - for i := 0; i < 10; i++ { + for range 10 { if got := f.Value(); got != nil { t.Fatalf("got value=%v; want nil", got) } diff --git a/util/fastuuid/fastuuid_test.go b/util/fastuuid/fastuuid_test.go index b514d6daa..f0d993904 100644 --- a/util/fastuuid/fastuuid_test.go +++ b/util/fastuuid/fastuuid_test.go @@ -23,21 +23,21 @@ func TestNewUUID(t *testing.T) { func BenchmarkBasic(b *testing.B) { b.Run("NewUUID", func(b *testing.B) { - for i := 0; i < b.N; i++ { + for range b.N { NewUUID() } }) b.Run("uuid.New-unpooled", func(b *testing.B) { uuid.DisableRandPool() - for i := 0; i < b.N; i++ { + for range b.N { uuid.New() } }) b.Run("uuid.New-pooled", func(b *testing.B) { uuid.EnableRandPool() - for i := 0; i < b.N; i++ { + for range b.N { uuid.New() } }) diff --git a/util/hashx/block512_test.go b/util/hashx/block512_test.go index 5c0f0581c..ca3ee0d78 100644 --- a/util/hashx/block512_test.go +++ b/util/hashx/block512_test.go @@ -46,7 +46,7 @@ type hasher interface { } func hashSuite(h hasher) { - for i := 0; i < 10; i++ { + for i := range 10 { for j := 0; j < 10; j++ { h.HashUint8(0x01) h.HashUint8(0x23) @@ -133,7 +133,7 @@ func Fuzz(f *testing.F) { c := qt.New(t) execute := func(h hasher, r *rand.Rand) { - for i := 0; i < r.Intn(256); i++ { + for range r.Intn(256) { switch r.Intn(5) { case 0: n := uint8(r.Uint64()) @@ -186,7 +186,7 @@ func Benchmark(b *testing.B) { b.Run("Hash", func(b *testing.B) { b.ReportAllocs() h := must.Get(New512(sha256.New())) - for i := 0; i < b.N; i++ { + for range b.N { h.Reset() hashSuite(h) h.Sum(sum[:0]) @@ -195,7 +195,7 @@ func Benchmark(b *testing.B) { b.Run("Naive", func(b *testing.B) { b.ReportAllocs() h := newNaive() - for i := 0; i < b.N; i++ { + for range b.N { h.Reset() hashSuite(h) h.Sum(sum[:0]) diff --git a/util/jsonutil/unmarshal_test.go b/util/jsonutil/unmarshal_test.go index b9d87c218..32f8402f0 100644 --- a/util/jsonutil/unmarshal_test.go +++ b/util/jsonutil/unmarshal_test.go @@ -49,7 +49,7 @@ func BenchmarkUnmarshal(b *testing.B) { var m any j := []byte("5") b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { Unmarshal(j, &m) } } @@ -58,7 +58,7 @@ func BenchmarkStdUnmarshal(b *testing.B) { var m any j := []byte("5") b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { json.Unmarshal(j, &m) } } diff --git a/util/limiter/limiter_test.go b/util/limiter/limiter_test.go index 098a9ece1..1f466d882 100644 --- a/util/limiter/limiter_test.go +++ b/util/limiter/limiter_test.go @@ -177,7 +177,7 @@ func TestDumpHTML(t *testing.T) { func allowed(t *testing.T, l *Limiter[string], key string, count int, now time.Time) { t.Helper() - for i := 0; i < count; i++ { + for i := range count { if !l.allow(key, now) { toks, ok := l.tokensForTest(key) t.Errorf("after %d times: allow(%q, %q) = false, want true (%d tokens available, in cache = %v)", i, key, now, toks, ok) @@ -187,7 +187,7 @@ func allowed(t *testing.T, l *Limiter[string], key string, count int, now time.T func denied(t *testing.T, l *Limiter[string], key string, count int, now time.Time) { t.Helper() - for i := 0; i < count; i++ { + for i := range count { if l.allow(key, now) { toks, ok := l.tokensForTest(key) t.Errorf("after %d times: allow(%q, %q) = true, want false (%d tokens available, in cache = %v)", i, key, now, toks, ok) diff --git a/util/lru/lru_test.go b/util/lru/lru_test.go index ea78b9229..3c4228a3f 100644 --- a/util/lru/lru_test.go +++ b/util/lru/lru_test.go @@ -77,7 +77,7 @@ func TestStressEvictions(t *testing.T) { MaxEntries: cacheSize, } - for i := 0; i < numProbes; i++ { + for range numProbes { v := vals[rand.Intn(len(vals))] c.Set(v, true) if l := c.Len(); l > cacheSize { @@ -106,7 +106,7 @@ func TestStressBatchedEvictions(t *testing.T) { c := Cache[uint64, bool]{} - for i := 0; i < numProbes; i++ { + for range numProbes { v := vals[rand.Intn(len(vals))] c.Set(v, true) if c.Len() == cacheSizeMax { @@ -127,7 +127,7 @@ func TestLRUStress(t *testing.T) { maxSize = 500 numProbes = 5_000 ) - for i := 0; i < numProbes; i++ { + for range numProbes { n := rand.Intn(maxSize * 2) op := rand.Intn(4) switch op { @@ -230,7 +230,7 @@ func BenchmarkLRU(b *testing.B) { c := Cache[int, bool]{MaxEntries: lruSize} b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { k := rand.Intn(maxval) if !c.Get(k) { c.Set(k, true) diff --git a/util/multierr/multierr_test.go b/util/multierr/multierr_test.go index 031b449a1..de7721a66 100644 --- a/util/multierr/multierr_test.go +++ b/util/multierr/multierr_test.go @@ -111,7 +111,7 @@ var sink error func BenchmarkEmpty(b *testing.B) { b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { sink = multierr.New(nil, nil, nil, multierr.Error{}) } } @@ -119,7 +119,7 @@ func BenchmarkEmpty(b *testing.B) { func BenchmarkNonEmpty(b *testing.B) { merr := multierr.New(io.ErrShortBuffer, io.ErrNoProgress) b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { sink = multierr.New(io.ErrUnexpectedEOF, merr, io.ErrClosedPipe) } } diff --git a/util/nocasemaps/nocase.go b/util/nocasemaps/nocase.go index 4da7e6c9b..2d91d8fe9 100644 --- a/util/nocasemaps/nocase.go +++ b/util/nocasemaps/nocase.go @@ -91,7 +91,7 @@ func AppendSliceElem[K ~string, S []E, E any](m map[K]S, k K, vs ...E) { } func isLowerASCII(s string) bool { - for i := 0; i < len(s); i++ { + for i := range len(s) { if c := s[i]; c >= utf8.RuneSelf || ('A' <= c && c <= 'Z') { return false } diff --git a/util/nocasemaps/nocase_test.go b/util/nocasemaps/nocase_test.go index 7d99f38ff..5275b3ee6 100644 --- a/util/nocasemaps/nocase_test.go +++ b/util/nocasemaps/nocase_test.go @@ -112,13 +112,13 @@ func Benchmark(b *testing.B) { b.Run("Get", func(b *testing.B) { b.Run("Naive", func(b *testing.B) { b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { testSink = testMap[strings.ToLower(key)] } }) b.Run("NoCase", func(b *testing.B) { b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { testSink = Get(testMap, key) } }) @@ -127,7 +127,7 @@ func Benchmark(b *testing.B) { b.Run("Naive", func(b *testing.B) { b.ReportAllocs() testMap[strings.ToLower(key)] = testValue - for i := 0; i < b.N; i++ { + for range b.N { testMap[strings.ToLower(key)] = testValue } xmaps.Clear(testMap) @@ -135,7 +135,7 @@ func Benchmark(b *testing.B) { b.Run("NoCase", func(b *testing.B) { b.ReportAllocs() Set(testMap, key, testValue) - for i := 0; i < b.N; i++ { + for range b.N { Set(testMap, key, testValue) } xmaps.Clear(testMap) @@ -144,13 +144,13 @@ func Benchmark(b *testing.B) { b.Run("Delete", func(b *testing.B) { b.Run("Naive", func(b *testing.B) { b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { delete(testMap, strings.ToLower(key)) } }) b.Run("NoCase", func(b *testing.B) { b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { Delete(testMap, key) } }) diff --git a/util/pidowner/pidowner_test.go b/util/pidowner/pidowner_test.go index 960a0e930..19c9ab46d 100644 --- a/util/pidowner/pidowner_test.go +++ b/util/pidowner/pidowner_test.go @@ -31,7 +31,7 @@ func TestOwnerOfPID(t *testing.T) { func TestNotFoundError(t *testing.T) { // Try a bunch of times to stumble upon a pid that doesn't exist... const tries = 50 - for i := 0; i < tries; i++ { + for range tries { _, err := OwnerOfPID(rand.Intn(1e9)) if err == ErrNotImplemented { t.Skip(err) diff --git a/util/race/race.go b/util/race/race.go index 041ce546f..26c8e13eb 100644 --- a/util/race/race.go +++ b/util/race/race.go @@ -87,7 +87,7 @@ func (rh *Race[T]) Start(ctx context.Context) (T, error) { // For each possible result, get it off the channel. var errs []error - for i := 0; i < 2; i++ { + for range 2 { res := <-rh.results // If this was an error, store it and hope that the other diff --git a/util/ringbuffer/ringbuffer.go b/util/ringbuffer/ringbuffer.go index d30cf9171..baca2afe8 100644 --- a/util/ringbuffer/ringbuffer.go +++ b/util/ringbuffer/ringbuffer.go @@ -51,7 +51,7 @@ func (rb *RingBuffer[T]) GetAll() []T { rb.mu.Lock() defer rb.mu.Unlock() out := make([]T, len(rb.buf)) - for i := 0; i < len(rb.buf); i++ { + for i := range len(rb.buf) { x := (rb.pos + i) % rb.max out[i] = rb.buf[x] } diff --git a/util/ringbuffer/ringbuffer_test.go b/util/ringbuffer/ringbuffer_test.go index fae3f5328..e10096bfb 100644 --- a/util/ringbuffer/ringbuffer_test.go +++ b/util/ringbuffer/ringbuffer_test.go @@ -12,7 +12,7 @@ func TestRingBuffer(t *testing.T) { const numItems = 10 rb := New[int](numItems) - for i := 0; i < numItems-1; i++ { + for i := range numItems - 1 { rb.Add(i) } diff --git a/util/set/slice.go b/util/set/slice.go index 9c300cc28..38551aee1 100644 --- a/util/set/slice.go +++ b/util/set/slice.go @@ -67,7 +67,7 @@ func (ss *Slice[T]) Add(vs ...T) { // AddSlice adds all elements in vs to the set. func (ss *Slice[T]) AddSlice(vs views.Slice[T]) { - for i := 0; i < vs.Len(); i++ { + for i := range vs.Len() { ss.Add(vs.At(i)) } } diff --git a/util/singleflight/singleflight_test.go b/util/singleflight/singleflight_test.go index 26a08ed60..b98fae885 100644 --- a/util/singleflight/singleflight_test.go +++ b/util/singleflight/singleflight_test.go @@ -69,7 +69,7 @@ func TestDoDupSuppress(t *testing.T) { const n = 10 wg1.Add(1) - for i := 0; i < n; i++ { + for range n { wg1.Add(1) wg2.Add(1) go func() { @@ -167,7 +167,7 @@ func TestPanicDo(t *testing.T) { waited := int32(n) panicCount := int32(0) done := make(chan struct{}) - for i := 0; i < n; i++ { + for range n { go func() { defer func() { if err := recover(); err != nil { @@ -204,7 +204,7 @@ func TestGoexitDo(t *testing.T) { const n = 5 waited := int32(n) done := make(chan struct{}) - for i := 0; i < n; i++ { + for range n { go func() { var err error defer func() { diff --git a/util/slicesx/slicesx_test.go b/util/slicesx/slicesx_test.go index b4806f6b3..46bd666c3 100644 --- a/util/slicesx/slicesx_test.go +++ b/util/slicesx/slicesx_test.go @@ -38,7 +38,7 @@ func TestInterleave(t *testing.T) { func BenchmarkInterleave(b *testing.B) { b.ReportAllocs() b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { Interleave( []int{1, 2, 3}, []int{9, 8, 7}, @@ -48,7 +48,7 @@ func BenchmarkInterleave(b *testing.B) { func TestShuffle(t *testing.T) { var sl []int - for i := 0; i < 100; i++ { + for i := range 100 { sl = append(sl, i) } diff --git a/util/topk/topk.go b/util/topk/topk.go index aef779102..d3bbb2c6d 100644 --- a/util/topk/topk.go +++ b/util/topk/topk.go @@ -145,7 +145,7 @@ func PickParams(err, probability float64) (hashes, buckets int) { } func (cms *CountMinSketch) init(hashes, buckets int) { - for i := 0; i < hashes; i++ { + for range hashes { cms.hashes = append(cms.hashes, maphash.MakeSeed()) } diff --git a/util/topk/topk_test.go b/util/topk/topk_test.go index 499948b5f..d30342e90 100644 --- a/util/topk/topk_test.go +++ b/util/topk/topk_test.go @@ -49,7 +49,7 @@ func TestTopK(t *testing.T) { }, 4, 1000) // Add the first 10 integers with counts equal to 2x their value - for i := 0; i < 10; i++ { + for i := range 10 { topk.AddN(i, uint64(i*2)) } @@ -82,7 +82,7 @@ func BenchmarkCountMinSketch(b *testing.B) { b.ReportAllocs() var enc [8]byte - for i := 0; i < b.N; i++ { + for i := range b.N { binary.LittleEndian.PutUint64(enc[:], uint64(i)) cms.Add(enc[:]) } @@ -104,7 +104,7 @@ func BenchmarkTopK(b *testing.B) { b.ResetTimer() b.ReportAllocs() - for i := 0; i < b.N; i++ { + for i := range b.N { topk.Add(i) } out = topk.AppendTop(out[:0]) // should not allocate diff --git a/util/uniq/slice_test.go b/util/uniq/slice_test.go index eed0d5fd5..564fc0866 100644 --- a/util/uniq/slice_test.go +++ b/util/uniq/slice_test.go @@ -94,7 +94,7 @@ func benchmark(b *testing.B, size int64, reset func(s []byte)) { b.SetBytes(size) s := make([]byte, size) b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { s = s[:size] reset(s) uniq.ModifySlice(&s) diff --git a/util/winutil/restartmgr_windows.go b/util/winutil/restartmgr_windows.go index 981283dc8..ee10559b8 100644 --- a/util/winutil/restartmgr_windows.go +++ b/util/winutil/restartmgr_windows.go @@ -25,7 +25,7 @@ import ( var ( // ErrDefunctProcess is returned by (*UniqueProcess).AsRestartableProcess // when the process no longer exists. - ErrDefunctProcess = errors.New("process is defunct") + ErrDefunctProcess = errors.New("process is defunct") // ErrProcessNotRestartable is returned by (*UniqueProcess).AsRestartableProcess // when the process has previously indicated that it must not be restarted // during a patch/upgrade. diff --git a/util/winutil/restartmgr_windows_test.go b/util/winutil/restartmgr_windows_test.go index 0293bc135..6b2d75c3c 100644 --- a/util/winutil/restartmgr_windows_test.go +++ b/util/winutil/restartmgr_windows_test.go @@ -67,7 +67,7 @@ func testRestartableProcessesImpl(N int, t *testing.T) { const binary = "testrestartableprocesses" fq := pathToTestProg(t, binary) - for i := 0; i < N; i++ { + for range N { startTestProg(t, binary, "RestartableProcess") } t.Cleanup(func() { diff --git a/util/winutil/testdata/testrestartableprocesses/main.go b/util/winutil/testdata/testrestartableprocesses/main.go index f5afdf769..0a83af630 100644 --- a/util/winutil/testdata/testrestartableprocesses/main.go +++ b/util/winutil/testdata/testrestartableprocesses/main.go @@ -10,7 +10,7 @@ import "os" var ( cmds = map[string]func(){} - err error + err error ) func register(name string, f func()) { diff --git a/util/zstdframe/zstd_test.go b/util/zstdframe/zstd_test.go index fb012cde7..120fd3508 100644 --- a/util/zstdframe/zstd_test.go +++ b/util/zstdframe/zstd_test.go @@ -128,7 +128,7 @@ func BenchmarkEncode(b *testing.B) { b.Run(bb.name, func(b *testing.B) { b.ReportAllocs() b.SetBytes(int64(len(src))) - for i := 0; i < b.N; i++ { + for range b.N { dst = AppendEncode(dst[:0], src, bb.opts...) } }) @@ -153,7 +153,7 @@ func BenchmarkDecode(b *testing.B) { b.Run(bb.name, func(b *testing.B) { b.ReportAllocs() b.SetBytes(int64(len(src))) - for i := 0; i < b.N; i++ { + for range b.N { dst = must.Get(AppendDecode(dst[:0], src, bb.opts...)) } }) @@ -164,12 +164,12 @@ func BenchmarkEncodeParallel(b *testing.B) { numCPU := runtime.NumCPU() for _, coder := range coders { dsts = dsts[:0] - for i := 0; i < numCPU; i++ { + for range numCPU { dsts = append(dsts, coder.appendEncode(nil, src)) } b.Run(coder.name, func(b *testing.B) { b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { var group sync.WaitGroup for j := 0; j < numCPU; j++ { group.Add(1) @@ -189,12 +189,12 @@ func BenchmarkDecodeParallel(b *testing.B) { for _, coder := range coders { dsts = dsts[:0] src := AppendEncode(nil, src) - for i := 0; i < numCPU; i++ { + for range numCPU { dsts = append(dsts, must.Get(coder.appendDecode(nil, src))) } b.Run(coder.name, func(b *testing.B) { b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { var group sync.WaitGroup for j := 0; j < numCPU; j++ { group.Add(1) diff --git a/version/cmp.go b/version/cmp.go index 857d43b1e..494a7ea72 100644 --- a/version/cmp.go +++ b/version/cmp.go @@ -159,7 +159,7 @@ func atoi(s string) (int, bool) { } un := uint(0) - for i := 0; i < len(s); i++ { + for i := range len(s) { c := s[i] if c < '0' || c > '9' { return 0, false diff --git a/version/distro/distro_test.go b/version/distro/distro_test.go index 63edb9299..4d61c7205 100644 --- a/version/distro/distro_test.go +++ b/version/distro/distro_test.go @@ -8,7 +8,7 @@ import "testing" func BenchmarkGet(b *testing.B) { b.ReportAllocs() var d Distro - for i := 0; i < b.N; i++ { + for range b.N { d = Get() } _ = d diff --git a/wgengine/filter/filter_test.go b/wgengine/filter/filter_test.go index 1d7521821..588dcd57e 100644 --- a/wgengine/filter/filter_test.go +++ b/wgengine/filter/filter_test.go @@ -313,7 +313,7 @@ func BenchmarkFilter(b *testing.B) { acl := newFilter(b.Logf) b.ReportAllocs() b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { q := &packet.Parsed{} q.Decode(bench.packet) // This branch seems to have no measurable impact on performance. diff --git a/wgengine/magicsock/endpoint_tracker_test.go b/wgengine/magicsock/endpoint_tracker_test.go index b6a2699c1..6fccdfd57 100644 --- a/wgengine/magicsock/endpoint_tracker_test.go +++ b/wgengine/magicsock/endpoint_tracker_test.go @@ -174,7 +174,7 @@ func TestEndpointTrackerMaxNum(t *testing.T) { // the endpointTracker, we will return all of them (even if they're for // the same address). var inputEps []tailcfg.Endpoint - for i := 0; i < endpointTrackerMaxPerAddr+5; i++ { + for i := range endpointTrackerMaxPerAddr + 5 { inputEps = append(inputEps, tailcfg.Endpoint{ Addr: netip.AddrPortFrom(netip.MustParseAddr("1.2.3.4"), 10200+uint16(i)), Type: tailcfg.EndpointSTUN, diff --git a/wgengine/magicsock/magicsock_test.go b/wgengine/magicsock/magicsock_test.go index 8bbab15e0..23f029eec 100644 --- a/wgengine/magicsock/magicsock_test.go +++ b/wgengine/magicsock/magicsock_test.go @@ -453,7 +453,7 @@ func TestPickDERPFallback(t *testing.T) { } // Test that it's consistent. - for i := 0; i < 50; i++ { + for range 50 { b := c.pickDERPFallback() if a != b { t.Fatalf("got inconsistent %d vs %d values", a, b) @@ -463,7 +463,7 @@ func TestPickDERPFallback(t *testing.T) { // Test that that the pointer value of c is blended in and // distribution over nodes works. got := map[int]int{} - for i := 0; i < 50; i++ { + for range 50 { c = newConn() c.derpMap = dm got[c.pickDERPFallback()]++ @@ -1408,7 +1408,7 @@ func TestReceiveFromAllocs(t *testing.T) { func BenchmarkReceiveFrom(b *testing.B) { roundTrip := setUpReceiveFrom(b) - for i := 0; i < b.N; i++ { + for range b.N { roundTrip() } } @@ -1435,7 +1435,7 @@ func BenchmarkReceiveFrom_Native(b *testing.B) { } buf := make([]byte, 2<<10) - for i := 0; i < b.N; i++ { + for range b.N { if _, err := sendConn.WriteTo(sendBuf, dstAddr); err != nil { b.Fatalf("WriteTo: %v", err) } @@ -1484,7 +1484,7 @@ func TestSetNetworkMapChangingNodeKey(t *testing.T) { t.Fatal(err) } - for i := 0; i < 3; i++ { + for range 3 { conn.SetNetworkMap(&netmap.NetworkMap{ Peers: nodeViews([]*tailcfg.Node{ { @@ -1567,13 +1567,13 @@ func TestRebindStress(t *testing.T) { wg.Add(2) go func() { defer wg.Done() - for i := 0; i < 2000; i++ { + for range 2000 { conn.Rebind() } }() go func() { defer wg.Done() - for i := 0; i < 2000; i++ { + for range 2000 { conn.Rebind() } }() @@ -1827,7 +1827,7 @@ func TestStressSetNetworkMap(t *testing.T) { prng := rand.New(rand.NewSource(int64(seed))) const iters = 1000 // approx 0.5s on an m1 mac - for i := 0; i < iters; i++ { + for range iters { for j := 0; j < npeers; j++ { // Randomize which peers are present. if prng.Int()&1 == 0 { @@ -2215,7 +2215,7 @@ func Test_batchingUDPConn_coalesceMessages(t *testing.T) { if got != len(tt.wantLens) { t.Fatalf("got len %d want: %d", got, len(tt.wantLens)) } - for i := 0; i < got; i++ { + for i := range got { if msgs[i].Addr != addr { t.Errorf("msgs[%d].Addr != passed addr", i) } diff --git a/wgengine/netstack/netstack_test.go b/wgengine/netstack/netstack_test.go index a8a4edcd9..51292c649 100644 --- a/wgengine/netstack/netstack_test.go +++ b/wgengine/netstack/netstack_test.go @@ -75,7 +75,7 @@ func TestInjectInboundLeak(t *testing.T) { pkt := &packet.Parsed{} const N = 10_000 ms0 := getMemStats() - for i := 0; i < N; i++ { + for range N { outcome := ns.injectInbound(pkt, tunWrap) if outcome != filter.DropSilently { t.Fatalf("got outcome %v; want DropSilently", outcome) diff --git a/wgengine/router/ifconfig_windows.go b/wgengine/router/ifconfig_windows.go index 87ff69b3f..0c09a728f 100644 --- a/wgengine/router/ifconfig_windows.go +++ b/wgengine/router/ifconfig_windows.go @@ -265,7 +265,7 @@ func configureInterface(cfg *Config, tun *tun.NativeTun) (retErr error) { // new interface has come up. Poll periodically until it // does. const tries = 20 - for i := 0; i < tries; i++ { + for i := range tries { found, err := setPrivateNetwork(luid) if err != nil { networkCategoryWarning.Set(fmt.Errorf("set-network-category: %w", err)) @@ -398,7 +398,7 @@ func configureInterface(cfg *Config, tun *tun.NativeTun) (retErr error) { slices.SortFunc(routes, (*routeData).Compare) deduplicatedRoutes := []*routeData{} - for i := 0; i < len(routes); i++ { + for i := range len(routes) { // There's only one way to get to a given IP+Mask, so delete // all matches after the first. if i > 0 && routes[i].Destination == routes[i-1].Destination { diff --git a/wgengine/router/ifconfig_windows_test.go b/wgengine/router/ifconfig_windows_test.go index 64c0ff0e9..11b98d1d7 100644 --- a/wgengine/router/ifconfig_windows_test.go +++ b/wgengine/router/ifconfig_windows_test.go @@ -82,7 +82,7 @@ func TestRouteLess(t *testing.T) { } func TestRouteDataLessConsistent(t *testing.T) { - for i := 0; i < 10000; i++ { + for range 10000 { ri := randRouteData() rj := randRouteData() if ri.Less(rj) && rj.Less(ri) { diff --git a/wgengine/router/router_linux_test.go b/wgengine/router/router_linux_test.go index fcf12b03e..c5657e622 100644 --- a/wgengine/router/router_linux_test.go +++ b/wgengine/router/router_linux_test.go @@ -909,7 +909,7 @@ func TestDelRouteIdempotent(t *testing.T) { t.Error(err) continue } - for i := 0; i < 2; i++ { + for i := range 2 { if err := lt.r.delRoute(cidr); err != nil { t.Errorf("delRoute(i=%d): %v", i, err) } diff --git a/wgengine/router/router_test.go b/wgengine/router/router_test.go index 4b0f51f57..9c83acfe7 100644 --- a/wgengine/router/router_test.go +++ b/wgengine/router/router_test.go @@ -28,7 +28,7 @@ func TestConfigEqual(t *testing.T) { } configType := reflect.TypeFor[Config]() configFields := []string{} - for i := 0; i < configType.NumField(); i++ { + for i := range configType.NumField() { configFields = append(configFields, configType.Field(i).Name) } if !reflect.DeepEqual(configFields, testedFields) { diff --git a/wgengine/userspace_test.go b/wgengine/userspace_test.go index 4a9b11587..6d086a448 100644 --- a/wgengine/userspace_test.go +++ b/wgengine/userspace_test.go @@ -164,7 +164,7 @@ func TestUserspaceEnginePortReconfig(t *testing.T) { // Keep making a wgengine until we find an unused port var ue *userspaceEngine - for i := 0; i < 100; i++ { + for i := range 100 { attempt := uint16(defaultPort + i) e, err := NewFakeUserspaceEngine(t.Logf, attempt, &knobs) if err != nil { @@ -335,7 +335,7 @@ func BenchmarkGenLocalAddrFunc(b *testing.B) { m := map[netip.Addr]bool{ la1: true, } - for i := 0; i < b.N; i++ { + for range b.N { x = m[la1] x = m[lanot] } @@ -347,7 +347,7 @@ func BenchmarkGenLocalAddrFunc(b *testing.B) { la1: true, la2: true, } - for i := 0; i < b.N; i++ { + for range b.N { x = m[la1] x = m[lanot] } @@ -358,7 +358,7 @@ func BenchmarkGenLocalAddrFunc(b *testing.B) { f := func(t netip.Addr) bool { return t == la1 } - for i := 0; i < b.N; i++ { + for range b.N { x = f(la1) x = f(lanot) } @@ -369,7 +369,7 @@ func BenchmarkGenLocalAddrFunc(b *testing.B) { f := func(t netip.Addr) bool { return t == la1 || t == la2 } - for i := 0; i < b.N; i++ { + for range b.N { x = f(la1) x = f(lanot) } diff --git a/wgengine/wgcfg/parser_test.go b/wgengine/wgcfg/parser_test.go index eb3345c10..a5d7ad44f 100644 --- a/wgengine/wgcfg/parser_test.go +++ b/wgengine/wgcfg/parser_test.go @@ -85,7 +85,7 @@ func BenchmarkFromUAPI(b *testing.B) { w.Flush() r := bytes.NewReader(buf.Bytes()) b.ReportAllocs() - for i := 0; i < b.N; i++ { + for range b.N { r.Seek(0, io.SeekStart) _, err := FromUAPI(r) if err != nil { diff --git a/wgengine/wglog/wglog_test.go b/wgengine/wglog/wglog_test.go index 617ed1ff1..9e9850f39 100644 --- a/wgengine/wglog/wglog_test.go +++ b/wgengine/wglog/wglog_test.go @@ -93,7 +93,7 @@ func BenchmarkSetPeers(b *testing.B) { b.ReportAllocs() x := wglog.NewLogger(logger.Discard) peers := [][]wgcfg.Peer{genPeers(0), genPeers(15), genPeers(16), genPeers(15)} - for i := 0; i < b.N; i++ { + for range b.N { for _, p := range peers { x.SetPeers(p) }