code: func (r *readfile) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) {
  	if node := r.ContainsCallExpr(n, c, false); node != nil {
  		for _, arg := range node.Args {
  			// handles path joining functions in Arg
  			// eg. os.Open(filepath.Join("/tmp/", file))
  			if callExpr, ok := arg.(*ast.CallExpr); ok {
  				if r.isJoinFunc(callExpr, c) {
  					return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil
  				}
  			}
  			// handles binary string concatenation eg. ioutil.Readfile("/tmp/" + file + "/blob")
  			if binExp, ok := arg.(*ast.BinaryExpr); ok {
  				// resolve all found identities from the BinaryExpr
  				if _, ok := gosec.FindVarIdentities(binExp, c); ok {
  					return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil
  				}
  			}
  
  			if ident, ok := arg.(*ast.Ident); ok {
  				obj := c.Info.ObjectOf(ident)
  				if _, ok := obj.(*types.Var); ok && !gosec.TryResolve(ident, c) {
  					return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil
  				}
  			}
  		}
  	}
  	return nil, nil
  }
docs: // Match inspects AST nodes to determine if the match the methods `os.Open` or `ioutil.ReadFile`