Go 1.19 released, so update supported Go versions. (#721)

* Go 1.19 released, so update supported Go versions.

* Remove the usage of the deprecated ioutil package.
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 759eea2..60f763c 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -18,7 +18,7 @@
     strategy:
       fail-fast: false
       matrix:
-        go: ['1.17', '1.18', 'tip']
+        go: ['1.18', '1.19', 'tip']
         # Supported macOS versions can be found in
         # https://github.com/actions/virtual-environments#available-environments.
         os: ['macos-10.15', 'macos-11']
@@ -106,7 +106,7 @@
     strategy:
       fail-fast: false
       matrix:
-        go: ['1.17', '1.18', 'tip']
+        go: ['1.18', '1.19', 'tip']
         os: ['ubuntu-20.04', 'ubuntu-18.04']
     steps:
       - name: Update Go version using setup-go
@@ -166,7 +166,7 @@
     strategy:
       fail-fast: false
       matrix:
-        go: ['1.17', '1.18']
+        go: ['1.18', '1.19']
     steps:
       - name: Update Go version using setup-go
         uses: actions/setup-go@v2
diff --git a/fuzz/fuzz_test.go b/fuzz/fuzz_test.go
index ab1a091..cbc4cc6 100644
--- a/fuzz/fuzz_test.go
+++ b/fuzz/fuzz_test.go
@@ -15,7 +15,7 @@
 package pprof
 
 import (
-	"io/ioutil"
+	"os"
 	"runtime"
 	"testing"
 
@@ -28,13 +28,13 @@
 	}
 
 	const path = "testdata/"
-	files, err := ioutil.ReadDir(path)
+	files, err := os.ReadDir(path)
 	if err != nil {
 		t.Errorf("Problem reading directory %s : %v", path, err)
 	}
 	for _, f := range files {
 		file := path + f.Name()
-		inbytes, err := ioutil.ReadFile(file)
+		inbytes, err := os.ReadFile(file)
 		if err != nil {
 			t.Errorf("Problem reading file: %s : %v", file, err)
 			continue
diff --git a/go.mod b/go.mod
index f3f4da9..e1e10df 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,6 @@
 module github.com/google/pprof
 
-go 1.17
+go 1.18
 
 require (
 	github.com/chzyer/readline v1.5.0
diff --git a/internal/driver/driver_test.go b/internal/driver/driver_test.go
index 2564eb0..a966f89 100644
--- a/internal/driver/driver_test.go
+++ b/internal/driver/driver_test.go
@@ -18,7 +18,6 @@
 	"bytes"
 	"flag"
 	"fmt"
-	"io/ioutil"
 	"net"
 	_ "net/http/pprof"
 	"os"
@@ -117,7 +116,7 @@
 			flags := strings.Split(tc.flags, ",")
 
 			// Encode profile into a protobuf and decode it again.
-			protoTempFile, err := ioutil.TempFile("", "profile_proto")
+			protoTempFile, err := os.CreateTemp("", "profile_proto")
 			if err != nil {
 				t.Errorf("cannot create tempfile: %v", err)
 			}
@@ -145,7 +144,7 @@
 			setCurrentConfig(baseConfig)
 
 			// Read the profile from the encoded protobuf
-			outputTempFile, err := ioutil.TempFile("", "profile_output")
+			outputTempFile, err := os.CreateTemp("", "profile_output")
 			if err != nil {
 				t.Errorf("cannot create tempfile: %v", err)
 			}
@@ -180,14 +179,14 @@
 			if err := PProf(o2); err != nil {
 				t.Errorf("%s: %v", tc.source, err)
 			}
-			b, err := ioutil.ReadFile(outputTempFile.Name())
+			b, err := os.ReadFile(outputTempFile.Name())
 			if err != nil {
 				t.Errorf("Failed to read profile %s: %v", outputTempFile.Name(), err)
 			}
 
 			// Read data file with expected solution
 			solution = "testdata/" + solution
-			sbuf, err := ioutil.ReadFile(solution)
+			sbuf, err := os.ReadFile(solution)
 			if err != nil {
 				t.Fatalf("reading solution file %s: %v", solution, err)
 			}
@@ -215,7 +214,7 @@
 				}
 				t.Errorf("%s\n%s\n", solution, d)
 				if *updateFlag {
-					err := ioutil.WriteFile(solution, b, 0644)
+					err := os.WriteFile(solution, b, 0644)
 					if err != nil {
 						t.Errorf("failed to update the solution file %q: %v", solution, err)
 					}
diff --git a/internal/driver/fetch.go b/internal/driver/fetch.go
index 0b36165..26fee83 100644
--- a/internal/driver/fetch.go
+++ b/internal/driver/fetch.go
@@ -18,7 +18,6 @@
 	"bytes"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"net/http"
 	"net/url"
 	"os"
@@ -507,7 +506,7 @@
 func statusCodeError(resp *http.Response) error {
 	if resp.Header.Get("X-Go-Pprof") != "" && strings.Contains(resp.Header.Get("Content-Type"), "text/plain") {
 		// error is from pprof endpoint
-		if body, err := ioutil.ReadAll(resp.Body); err == nil {
+		if body, err := io.ReadAll(resp.Body); err == nil {
 			return fmt.Errorf("server response: %s - %s", resp.Status, body)
 		}
 	}
diff --git a/internal/driver/fetch_test.go b/internal/driver/fetch_test.go
index bdd1732..289dc24 100644
--- a/internal/driver/fetch_test.go
+++ b/internal/driver/fetch_test.go
@@ -22,7 +22,6 @@
 	"crypto/x509"
 	"encoding/pem"
 	"fmt"
-	"io/ioutil"
 	"math/big"
 	"net"
 	"net/http"
@@ -52,7 +51,7 @@
 	saveHome := os.Getenv(homeEnv())
 	savePath := os.Getenv("PPROF_BINARY_PATH")
 
-	tempdir, err := ioutil.TempDir("", "home")
+	tempdir, err := os.MkdirTemp("", "home")
 	if err != nil {
 		t.Fatal("creating temp dir: ", err)
 	}
@@ -530,7 +529,7 @@
 		t.Skip("test assumes tcp available")
 	}
 	saveHome := os.Getenv(homeEnv())
-	tempdir, err := ioutil.TempDir("", "home")
+	tempdir, err := os.MkdirTemp("", "home")
 	if err != nil {
 		t.Fatal("creating temp dir: ", err)
 	}
@@ -564,7 +563,7 @@
 	}()
 	defer l.Close()
 
-	outputTempFile, err := ioutil.TempFile("", "profile_output")
+	outputTempFile, err := os.CreateTemp("", "profile_output")
 	if err != nil {
 		t.Fatalf("Failed to create tempfile: %v", err)
 	}
@@ -603,7 +602,7 @@
 		t.Skip("test assumes tcp available")
 	}
 	saveHome := os.Getenv(homeEnv())
-	tempdir, err := ioutil.TempDir("", "home")
+	tempdir, err := os.MkdirTemp("", "home")
 	if err != nil {
 		t.Fatal("creating temp dir: ", err)
 	}
@@ -645,7 +644,7 @@
 	}()
 	defer l.Close()
 
-	outputTempFile, err := ioutil.TempFile("", "profile_output")
+	outputTempFile, err := os.CreateTemp("", "profile_output")
 	if err != nil {
 		t.Fatalf("Failed to create tempfile: %v", err)
 	}
@@ -665,7 +664,7 @@
 		Symbolize: "remote",
 	}
 
-	certTempFile, err := ioutil.TempFile("", "cert_output")
+	certTempFile, err := os.CreateTemp("", "cert_output")
 	if err != nil {
 		t.Errorf("cannot create cert tempfile: %v", err)
 	}
@@ -673,7 +672,7 @@
 	defer certTempFile.Close()
 	certTempFile.Write(certBytes)
 
-	keyTempFile, err := ioutil.TempFile("", "key_output")
+	keyTempFile, err := os.CreateTemp("", "key_output")
 	if err != nil {
 		t.Errorf("cannot create key tempfile: %v", err)
 	}
diff --git a/internal/driver/settings.go b/internal/driver/settings.go
index 1e9154c..b784618 100644
--- a/internal/driver/settings.go
+++ b/internal/driver/settings.go
@@ -3,7 +3,6 @@
 import (
 	"encoding/json"
 	"fmt"
-	"io/ioutil"
 	"net/url"
 	"os"
 	"path/filepath"
@@ -33,7 +32,7 @@
 
 // readSettings reads settings from fname.
 func readSettings(fname string) (*settings, error) {
-	data, err := ioutil.ReadFile(fname)
+	data, err := os.ReadFile(fname)
 	if err != nil {
 		if os.IsNotExist(err) {
 			return &settings{}, nil
@@ -64,7 +63,7 @@
 		return fmt.Errorf("failed to create settings directory: %w", err)
 	}
 
-	if err := ioutil.WriteFile(fname, data, 0644); err != nil {
+	if err := os.WriteFile(fname, data, 0644); err != nil {
 		return fmt.Errorf("failed to write settings: %w", err)
 	}
 	return nil
diff --git a/internal/driver/settings_test.go b/internal/driver/settings_test.go
index e0ea14c..7d3aad9 100644
--- a/internal/driver/settings_test.go
+++ b/internal/driver/settings_test.go
@@ -1,7 +1,6 @@
 package driver
 
 import (
-	"io/ioutil"
 	"net/url"
 	"os"
 	"path/filepath"
@@ -13,7 +12,7 @@
 // and the name of the settings file. The caller must delete the directory when
 // done.
 func settingsDirAndFile(t *testing.T) (string, string) {
-	tmpDir, err := ioutil.TempDir("", "pprof_settings_test")
+	tmpDir, err := os.MkdirTemp("", "pprof_settings_test")
 	if err != nil {
 		t.Fatalf("error creating temporary directory: %v", err)
 	}
diff --git a/internal/driver/webui_test.go b/internal/driver/webui_test.go
index 2f9b89b..474bdad 100644
--- a/internal/driver/webui_test.go
+++ b/internal/driver/webui_test.go
@@ -16,7 +16,7 @@
 
 import (
 	"fmt"
-	"io/ioutil"
+	"io"
 	"net"
 	"net/http"
 	"net/http/httptest"
@@ -116,7 +116,7 @@
 			t.Error("could not fetch", c.path, err)
 			continue
 		}
-		data, err := ioutil.ReadAll(res.Body)
+		data, err := io.ReadAll(res.Body)
 		if err != nil {
 			t.Error("could not read response", c.path, err)
 			continue
@@ -148,7 +148,7 @@
 					t.Error("could not fetch", c.path, err)
 					return
 				}
-				if _, err = ioutil.ReadAll(res.Body); err != nil {
+				if _, err = io.ReadAll(res.Body); err != nil {
 					t.Error("could not read response", c.path, err)
 				}
 			}()
diff --git a/internal/graph/dotgraph_test.go b/internal/graph/dotgraph_test.go
index 0a94495..b375bb6 100644
--- a/internal/graph/dotgraph_test.go
+++ b/internal/graph/dotgraph_test.go
@@ -18,7 +18,7 @@
 	"bytes"
 	"flag"
 	"fmt"
-	"io/ioutil"
+	"os"
 	"path/filepath"
 	"reflect"
 	"strconv"
@@ -214,7 +214,7 @@
 
 func compareGraphs(t *testing.T, got []byte, wantFile string) {
 	wantFile = filepath.Join("testdata", wantFile)
-	want, err := ioutil.ReadFile(wantFile)
+	want, err := os.ReadFile(wantFile)
 	if err != nil {
 		t.Fatalf("error reading test file %s: %v", wantFile, err)
 	}
@@ -226,7 +226,7 @@
 		}
 		t.Errorf("Compose incorrectly wrote %s", string(d))
 		if *updateFlag {
-			err := ioutil.WriteFile(wantFile, got, 0644)
+			err := os.WriteFile(wantFile, got, 0644)
 			if err != nil {
 				t.Errorf("failed to update the golden file %q: %v", wantFile, err)
 			}
diff --git a/internal/proftest/proftest.go b/internal/proftest/proftest.go
index 160eb66..c4f8910 100644
--- a/internal/proftest/proftest.go
+++ b/internal/proftest/proftest.go
@@ -20,7 +20,6 @@
 	"encoding/json"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"os"
 	"os/exec"
 	"regexp"
@@ -31,14 +30,14 @@
 // differences. It is meant for testing purposes to display the
 // differences between expected and actual output.
 func Diff(b1, b2 []byte) (data []byte, err error) {
-	f1, err := ioutil.TempFile("", "proto_test")
+	f1, err := os.CreateTemp("", "proto_test")
 	if err != nil {
 		return nil, err
 	}
 	defer os.Remove(f1.Name())
 	defer f1.Close()
 
-	f2, err := ioutil.TempFile("", "proto_test")
+	f2, err := os.CreateTemp("", "proto_test")
 	if err != nil {
 		return nil, err
 	}
diff --git a/internal/report/report_test.go b/internal/report/report_test.go
index 9b394fb..b3e70b2 100644
--- a/internal/report/report_test.go
+++ b/internal/report/report_test.go
@@ -16,7 +16,7 @@
 
 import (
 	"bytes"
-	"io/ioutil"
+	"os"
 	"regexp"
 	"runtime"
 	"strings"
@@ -76,7 +76,7 @@
 			t.Fatalf("%s: %v", tc.want, err)
 		}
 
-		gold, err := ioutil.ReadFile(tc.want)
+		gold, err := os.ReadFile(tc.want)
 		if err != nil {
 			t.Fatalf("%s: %v", tc.want, err)
 		}
diff --git a/internal/report/source_test.go b/internal/report/source_test.go
index 2a6b9cf..2febfd1 100644
--- a/internal/report/source_test.go
+++ b/internal/report/source_test.go
@@ -17,7 +17,6 @@
 import (
 	"bytes"
 	"fmt"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"regexp"
@@ -123,7 +122,7 @@
 }
 
 func TestOpenSourceFile(t *testing.T) {
-	tempdir, err := ioutil.TempDir("", "")
+	tempdir, err := os.MkdirTemp("", "")
 	if err != nil {
 		t.Fatalf("failed to create temp dir: %v", err)
 	}
@@ -195,7 +194,7 @@
 				if err := os.MkdirAll(dir, 0755); err != nil {
 					t.Fatalf("failed to create dir %q: %v", dir, err)
 				}
-				if err := ioutil.WriteFile(path, nil, 0644); err != nil {
+				if err := os.WriteFile(path, nil, 0644); err != nil {
 					t.Fatalf("failed to create file %q: %v", path, err)
 				}
 			}
diff --git a/internal/symbolizer/symbolizer.go b/internal/symbolizer/symbolizer.go
index d243b80..87f202b 100644
--- a/internal/symbolizer/symbolizer.go
+++ b/internal/symbolizer/symbolizer.go
@@ -19,7 +19,7 @@
 
 import (
 	"fmt"
-	"io/ioutil"
+	"io"
 	"net/http"
 	"net/url"
 	"path/filepath"
@@ -110,13 +110,13 @@
 	if resp.StatusCode != http.StatusOK {
 		return nil, fmt.Errorf("http post %s: %v", source, statusCodeError(resp))
 	}
-	return ioutil.ReadAll(resp.Body)
+	return io.ReadAll(resp.Body)
 }
 
 func statusCodeError(resp *http.Response) error {
 	if resp.Header.Get("X-Go-Pprof") != "" && strings.Contains(resp.Header.Get("Content-Type"), "text/plain") {
 		// error is from pprof endpoint
-		if body, err := ioutil.ReadAll(resp.Body); err == nil {
+		if body, err := io.ReadAll(resp.Body); err == nil {
 			return fmt.Errorf("server response: %s - %s", resp.Status, body)
 		}
 	}
diff --git a/internal/transport/transport.go b/internal/transport/transport.go
index b5fb1dd..6c3bd0d 100644
--- a/internal/transport/transport.go
+++ b/internal/transport/transport.go
@@ -20,8 +20,8 @@
 	"crypto/tls"
 	"crypto/x509"
 	"fmt"
-	"io/ioutil"
 	"net/http"
+	"os"
 	"sync"
 
 	"github.com/google/pprof/internal/plugin"
@@ -86,7 +86,7 @@
 
 	if ca != "" {
 		caCertPool := x509.NewCertPool()
-		caCert, err := ioutil.ReadFile(ca)
+		caCert, err := os.ReadFile(ca)
 		if err != nil {
 			return fmt.Errorf("could not load CA specified by -tls_ca: %v", err)
 		}
diff --git a/profile/profile.go b/profile/profile.go
index 5a3807f..4ec00fe 100644
--- a/profile/profile.go
+++ b/profile/profile.go
@@ -21,7 +21,6 @@
 	"compress/gzip"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"math"
 	"path/filepath"
 	"regexp"
@@ -153,7 +152,7 @@
 // may be a gzip-compressed encoded protobuf or one of many legacy
 // profile formats which may be unsupported in the future.
 func Parse(r io.Reader) (*Profile, error) {
-	data, err := ioutil.ReadAll(r)
+	data, err := io.ReadAll(r)
 	if err != nil {
 		return nil, err
 	}
@@ -168,7 +167,7 @@
 	if len(data) >= 2 && data[0] == 0x1f && data[1] == 0x8b {
 		gz, err := gzip.NewReader(bytes.NewBuffer(data))
 		if err == nil {
-			data, err = ioutil.ReadAll(gz)
+			data, err = io.ReadAll(gz)
 		}
 		if err != nil {
 			return nil, fmt.Errorf("decompressing profile: %v", err)
diff --git a/profile/profile_test.go b/profile/profile_test.go
index ee8da7e..7767004 100644
--- a/profile/profile_test.go
+++ b/profile/profile_test.go
@@ -18,7 +18,7 @@
 	"bytes"
 	"flag"
 	"fmt"
-	"io/ioutil"
+	"os"
 	"path/filepath"
 	"reflect"
 	"strings"
@@ -49,7 +49,7 @@
 		"java.heap",
 		"java.contention",
 	} {
-		inbytes, err := ioutil.ReadFile(filepath.Join(path, source))
+		inbytes, err := os.ReadFile(filepath.Join(path, source))
 		if err != nil {
 			t.Fatal(err)
 		}
@@ -61,12 +61,12 @@
 		js := p.String()
 		goldFilename := path + source + ".string"
 		if *update {
-			err := ioutil.WriteFile(goldFilename, []byte(js), 0644)
+			err := os.WriteFile(goldFilename, []byte(js), 0644)
 			if err != nil {
 				t.Errorf("failed to update the golden file file %q: %v", goldFilename, err)
 			}
 		}
-		gold, err := ioutil.ReadFile(goldFilename)
+		gold, err := os.ReadFile(goldFilename)
 		if err != nil {
 			t.Fatalf("%s: %v", source, err)
 		}
@@ -134,7 +134,7 @@
 func TestCheckValid(t *testing.T) {
 	const path = "testdata/java.cpu"
 
-	inbytes, err := ioutil.ReadFile(path)
+	inbytes, err := os.ReadFile(path)
 	if err != nil {
 		t.Fatalf("failed to read profile file %q: %v", path, err)
 	}
@@ -196,7 +196,7 @@
 // temp filename. This is useful to recover a profile when the test
 // fails.
 func leaveTempfile(b []byte) string {
-	f1, err := ioutil.TempFile("", "profile_test")
+	f1, err := os.CreateTemp("", "profile_test")
 	if err != nil {
 		panic(err)
 	}