diff options
author | Andrea Nodari <andrea.nodari91@gmail.com> | 2018-06-21 18:01:01 +0100 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2018-12-10 23:08:15 +0000 |
commit | 963c9fdf9735bc464521cde3d46b596ce0d74eba (patch) | |
tree | 803892334b7c2f9f5daa6e4c9289c63609eb2e6c | |
parent | 1ccb66d1ef031ad70345d2ef1983a5814f405295 (diff) | |
download | go-git-963c9fdf9735bc464521cde3d46b596ce0d74eba.tar.gz |
cmd/cover: check that the argument of -var is valid
At the moment, the cover tool does not check that the argument of -var
is a valid identifier. Hence, it could generate a file that fails to
compile afterwards.
Updates #25280
Change-Id: I6eb1872736377680900a18a4a28ba002ab5ea8ca
Reviewed-on: https://go-review.googlesource.com/c/120316
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
-rw-r--r-- | src/cmd/cover/cover.go | 16 | ||||
-rw-r--r-- | src/cmd/cover/cover_test.go | 6 |
2 files changed, 22 insertions, 0 deletions
diff --git a/src/cmd/cover/cover.go b/src/cmd/cover/cover.go index 54cf4be25e..7f473a233c 100644 --- a/src/cmd/cover/cover.go +++ b/src/cmd/cover/cover.go @@ -16,6 +16,7 @@ import ( "log" "os" "sort" + "unicode" "cmd/internal/edit" "cmd/internal/objabi" @@ -116,6 +117,10 @@ func parseFlags() error { return fmt.Errorf("too many options") } + if *varVar != "" && !isValidIdentifier(*varVar) { + return fmt.Errorf("argument of -var is not a valid identifier: %v", *varVar) + } + if *mode != "" { switch *mode { case "set": @@ -676,3 +681,14 @@ func (f *File) addVariables(w io.Writer) { fmt.Fprintf(w, "var _ = %s.LoadUint32\n", atomicPackageName) } } + +func isValidIdentifier(ident string) bool { + first := true + for _, c := range ident { + if !unicode.IsLetter(c) && c != '_' && (first || !unicode.IsDigit(c)) { + return false // invalid identifier + } + first = false + } + return true +} diff --git a/src/cmd/cover/cover_test.go b/src/cmd/cover/cover_test.go index a374dc4e9b..aebe6f8cb5 100644 --- a/src/cmd/cover/cover_test.go +++ b/src/cmd/cover/cover_test.go @@ -145,6 +145,12 @@ func TestCover(t *testing.T) { cmd := exec.Command(testcover, "-mode=count", "-var=thisNameMustBeVeryLongToCauseOverflowOfCounterIncrementStatementOntoNextLineForTest", "-o", coverOutput, coverInput) run(cmd, t) + cmd = exec.Command(testcover, "-mode=set", "-var=Not_an-identifier", "-o", coverOutput, coverInput) + err = cmd.Run() + if err == nil { + t.Error("Expected cover to fail with an error") + } + // Copy testmain to testTempDir, so that it is in the same directory // as coverOutput. b, err := ioutil.ReadFile(testMain) |