mirror of
https://github.com/securego/gosec.git
synced 2024-12-25 12:05:52 +00:00
129be1561b
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
73 lines
1.9 KiB
Go
73 lines
1.9 KiB
Go
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// 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
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package core
|
|
|
|
import (
|
|
"go/ast"
|
|
)
|
|
|
|
type set map[string]bool
|
|
|
|
/// CallList is used to check for usage of specific packages
|
|
/// and functions.
|
|
type CallList map[string]set
|
|
|
|
/// NewCallList creates a new empty CallList
|
|
func NewCallList() CallList {
|
|
return make(CallList)
|
|
}
|
|
|
|
/// AddAll will add several calls to the call list at once
|
|
func (c CallList) AddAll(selector string, idents ...string) {
|
|
for _, ident := range idents {
|
|
c.Add(selector, ident)
|
|
}
|
|
}
|
|
|
|
/// Add a selector and call to the call list
|
|
func (c CallList) Add(selector, ident string) {
|
|
if _, ok := c[selector]; !ok {
|
|
c[selector] = make(set)
|
|
}
|
|
c[selector][ident] = true
|
|
}
|
|
|
|
/// Contains returns true if the package and function are
|
|
/// members of this call list.
|
|
func (c CallList) Contains(selector, ident string) bool {
|
|
if idents, ok := c[selector]; ok {
|
|
_, found := idents[ident]
|
|
return found
|
|
}
|
|
return false
|
|
}
|
|
|
|
/// ContainsCallExpr resolves the call expression name and type
|
|
/// or package and determines if it exists within the CallList
|
|
func (c CallList) ContainsCallExpr(n ast.Node, ctx *Context) bool {
|
|
selector, ident, err := GetCallInfo(n, ctx)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
// Try direct resolution
|
|
if c.Contains(selector, ident) {
|
|
return true
|
|
}
|
|
|
|
// Also support explicit path
|
|
if path, ok := GetImportPath(selector, ctx); ok {
|
|
return c.Contains(path, ident)
|
|
}
|
|
return false
|
|
}
|