]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cover: check that the argument of -var is valid
authorAndrea Nodari <andrea.nodari91@gmail.com>
Thu, 21 Jun 2018 17:01:01 +0000 (18:01 +0100)
committerIan Lance Taylor <iant@golang.org>
Mon, 10 Dec 2018 23:08:15 +0000 (23:08 +0000)
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>
src/cmd/cover/cover.go
src/cmd/cover/cover_test.go

index 54cf4be25ec7ffdb92e35172431dbec56c4bb03b..7f473a233c419b6437c19cc099f31e6ace2217e4 100644 (file)
@@ -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
+}
index a374dc4e9bb51720bd439248a55e546aa966c4a8..aebe6f8cb511f1aa0329bce2c0152b1ed9cfca25 100644 (file)
@@ -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)