Update error test case

There were several issues with the error test case that have been
addressed in this commit.

- It is possible to specify a whitelist of calls that error handling
  should be ignored for.
- Additional support for ast.ExprStmt for cases where the error is
  implicitly ignored.

There were several other additions to the helpers and call list in order
to support this type of functionality.

Fixes #54
This commit is contained in:
Grant Murphy
2016-11-18 14:09:10 -08:00
parent 5242a2c1df
commit 129be1561b
5 changed files with 187 additions and 69 deletions
+79 -29
View File
@@ -4,7 +4,7 @@
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -28,17 +28,17 @@ func TestErrorsMulti(t *testing.T) {
issues := gasTestRunner(
`package main
import (
"fmt"
)
import (
"fmt"
)
func test() (val int, err error) {
return 0, nil
}
func test() (val int, err error) {
return 0, nil
}
func main() {
v, _ := test()
}`, analyzer)
func main() {
v, _ := test()
}`, analyzer)
checkTestResults(t, issues, 1, "Errors unhandled")
}
@@ -51,19 +51,30 @@ func TestErrorsSingle(t *testing.T) {
issues := gasTestRunner(
`package main
import (
"fmt"
)
import (
"fmt"
)
func test() (err error) {
return nil
}
func a() error {
return fmt.Errorf("This is an error")
}
func main() {
_ := test()
}`, analyzer)
func b() {
fmt.Println("b")
}
checkTestResults(t, issues, 1, "Errors unhandled")
func c() string {
return fmt.Sprintf("This isn't anything")
}
func main() {
_ = a()
a()
b()
_ = c()
c()
}`, analyzer)
checkTestResults(t, issues, 2, "Errors unhandled")
}
func TestErrorsGood(t *testing.T) {
@@ -74,17 +85,56 @@ func TestErrorsGood(t *testing.T) {
issues := gasTestRunner(
`package main
import (
"fmt"
)
import (
"fmt"
)
func test() err error {
return 0, nil
}
func test() err error {
return 0, nil
}
func main() {
e := test()
}`, analyzer)
func main() {
e := test()
}`, analyzer)
checkTestResults(t, issues, 0, "")
}
func TestErrorsWhitelisted(t *testing.T) {
config := map[string]interface{}{
"ignoreNosec": false,
"G104": map[string][]string{
"compress/zlib": []string{"NewReader"},
"io": []string{"Copy"},
},
}
analyzer := gas.NewAnalyzer(config, nil)
analyzer.AddRule(NewNoErrorCheck(config))
source := `package main
import (
"io"
"os"
"fmt"
"bytes"
"compress/zlib"
)
func a() error {
return fmt.Errorf("This is an error ok")
}
func main() {
// Expect at least one failure
_ = a()
var b bytes.Buffer
// Default whitelist
nbytes, _ := b.Write([]byte("Hello "))
// Whitelisted via configuration
r, _ := zlib.NewReader(&b)
io.Copy(os.Stdout, r)
}`
issues := gasTestRunner(source, analyzer)
checkTestResults(t, issues, 1, "Errors unhandled")
}