mirror of
https://github.com/securego/gosec.git
synced 2025-03-21 21:17:32 +02:00
- Update call list to work directly with call expression - Add call list test cases - Extend helpers to add GetCallInfo to resolve call name and package or type if it's a var. - Add test cases to ensure correct behaviour
59 lines
1.1 KiB
Go
59 lines
1.1 KiB
Go
package core
|
|
|
|
import (
|
|
"go/ast"
|
|
"testing"
|
|
)
|
|
|
|
type callListRule struct {
|
|
MetaData
|
|
callList CallList
|
|
matched int
|
|
}
|
|
|
|
func (r *callListRule) Match(n ast.Node, c *Context) (gi *Issue, err error) {
|
|
if r.callList.ContainsCallExpr(n, c) {
|
|
r.matched += 1
|
|
}
|
|
return nil, nil
|
|
}
|
|
|
|
func TestCallListContainsCallExpr(t *testing.T) {
|
|
config := map[string]interface{}{"ignoreNosec": false}
|
|
analyzer := NewAnalyzer(config, nil)
|
|
rule := &callListRule{
|
|
MetaData: MetaData{
|
|
Severity: Low,
|
|
Confidence: Low,
|
|
What: "A dummy rule",
|
|
},
|
|
callList: NewCallListFor("bytes.Buffer", "Write", "WriteTo"),
|
|
matched: 0,
|
|
}
|
|
analyzer.AddRule(rule, []ast.Node{(*ast.CallExpr)(nil)})
|
|
source := `
|
|
package main
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
)
|
|
func main() {
|
|
var b bytes.Buffer
|
|
b.Write([]byte("Hello "))
|
|
fmt.Fprintf(&b, "world!")
|
|
}`
|
|
|
|
analyzer.ProcessSource("dummy.go", source)
|
|
if rule.matched != 1 {
|
|
t.Errorf("Expected to match a bytes.Buffer.Write call")
|
|
}
|
|
}
|
|
|
|
func TestCallListContains(t *testing.T) {
|
|
callList := NewCallList()
|
|
callList.Add("fmt", "Printf")
|
|
if !callList.Contains("fmt", "Printf") {
|
|
t.Errorf("Expected call list to contain fmt.Printf")
|
|
}
|
|
}
|