v2.0.1+incompatible Latest Latest

This package is not in the latest version of its module.

Go to latest
Published: Dec 5, 2017 License: MIT, Apache-2.0 Imports: 14 Imported by: 0



Package core holds the central scanning logic used by GAS

(c) Copyright 2016 Hewlett Packard Enterprise Development LP

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

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.



This section is empty.


This section is empty.


func GetCallInfo

func GetCallInfo(n ast.Node, ctx *Context) (string, string, error)

GetCallInfo returns the package or type and name associated with a call expression.

func GetCallObject

func GetCallObject(n ast.Node, ctx *Context) (*ast.CallExpr, types.Object)

GetCallObject returns the object and call expression and associated object for a given AST node. nil, nil will be returned if the object cannot be resolved.

func GetChar

func GetChar(n ast.Node) (byte, error)

GetInt will read and return a char value from an ast.BasicLit

func GetFloat

func GetFloat(n ast.Node) (float64, error)

GetInt will read and return a float value from an ast.BasicLit

func GetImportPath

func GetImportPath(name string, ctx *Context) (string, bool)

GetImportPath resolves the full import path of an identifer based on the imports in the current context.

func GetImportedName

func GetImportedName(path string, ctx *Context) (string, bool)

GetImportedName returns the name used for the package within the code. It will resolve aliases and ignores initalization only imports.

func GetInt

func GetInt(n ast.Node) (int64, error)

GetInt will read and return an integer value from an ast.BasicLit

func GetLocation

func GetLocation(n ast.Node, ctx *Context) (string, int)

GetLocation returns the filename and line number of an ast.Node

func GetString

func GetString(n ast.Node) (string, error)

GetInt will read and return a string value from an ast.BasicLit

func MatchCall

func MatchCall(n ast.Node, r *regexp.Regexp) *ast.CallExpr

MatchCall will match an ast.CallNode if its method name obays the given regex.

func MatchCallByPackage

func MatchCallByPackage(n ast.Node, c *Context, pkg string, names ...string) (*ast.CallExpr, bool)

MatchCallByPackage ensures that the specified package is imported, adjusts the name for any aliases and ignores cases that are initialization only imports.


node, matched := MatchCallByPackage(n, ctx, "math/rand", "Read")

func MatchCallByType

func MatchCallByType(n ast.Node, ctx *Context, requiredType string, calls ...string) (*ast.CallExpr, bool)

MatchCallByType ensures that the node is a call expression to a specific object type.


node, matched := MatchCallByType(n, ctx, "bytes.Buffer", "WriteTo", "Write")

func MatchCompLit

func MatchCompLit(n ast.Node, r *regexp.Regexp) *ast.CompositeLit

MatchCompLit will match an ast.CompositeLit if its string value obays the given regex.

func Select

func Select(s Selector, n ast.Node, bits ...reflect.Type)

func SimpleSelect

func SimpleSelect(n ast.Node, bits ...reflect.Type) ast.Node

SimpleSelect will try to match a path through a sub-tree starting at a given AST node. The type of each node in the path at a given depth must match its entry in list of node types given.

func TryResolve

func TryResolve(n ast.Node, c *Context) bool

TryResolve will attempt, given a subtree starting at some ATS node, to resolve all values contained within to a known constant. It is used to check for any unkown values in compound expressions.


type Analyzer

type Analyzer struct {
	Issues []*Issue `json:"issues"`
	Stats  *Metrics `json:"metrics"`
	// contains filtered or unexported fields

The Analyzer object is the main object of GAS. It has methods traverse an AST and invoke the correct checking rules as on each node as required.

func NewAnalyzer

func NewAnalyzer(conf map[string]interface{}, logger *log.Logger) Analyzer

NewAnalyzer builds a new anaylzer.

func (*Analyzer) AddRule

func (gas *Analyzer) AddRule(r Rule, nodes []ast.Node)

AddRule adds a rule into a rule set list mapped to the given AST node's type. The node is only needed for its type and is not otherwise used.

func (*Analyzer) Process

func (gas *Analyzer) Process(filename string) error

Process reads in a source file, convert it to an AST and traverse it. Rule methods added with AddRule will be invoked as necessary.

func (*Analyzer) ProcessSource

func (gas *Analyzer) ProcessSource(filename string, source string) error

ProcessSource will convert a source code string into an AST and traverse it. Rule methods added with AddRule will be invoked as necessary. The string is identified by the filename given but no file IO will be done.

func (*Analyzer) Visit

func (gas *Analyzer) Visit(n ast.Node) ast.Visitor

Visit runs the GAS visitor logic over an AST created by parsing go code. Rule methods added with AddRule will be invoked as necessary.

type CallList

type CallList map[string]set

/ CallList is used to check for usage of specific packages / and functions.

func NewCallList

func NewCallList() CallList

/ NewCallList creates a new empty CallList

func (CallList) Add

func (c CallList) Add(selector, ident string)

/ Add a selector and call to the call list

func (CallList) AddAll

func (c CallList) AddAll(selector string, idents ...string)

/ AddAll will add several calls to the call list at once

func (CallList) Contains

func (c CallList) Contains(selector, ident string) bool

/ Contains returns true if the package and function are / members of this call list.

func (CallList) ContainsCallExpr

func (c CallList) ContainsCallExpr(n ast.Node, ctx *Context) bool

/ ContainsCallExpr resolves the call expression name and type / or package and determines if it exists within the CallList

type Context

type Context struct {
	FileSet  *token.FileSet
	Comments ast.CommentMap
	Info     *types.Info
	Pkg      *types.Package
	Root     *ast.File
	Config   map[string]interface{}
	Imports  *ImportInfo

The Context is populated with data parsed from the source code as it is scanned. It is passed through to all rule functions as they are called. Rules may use this data in conjunction withe the encoutered AST node.

type ImportInfo

type ImportInfo struct {
	Imported map[string]string
	Aliased  map[string]string
	InitOnly map[string]bool

ImportInfo is used to track aliased and initialization only imports.

func NewImportInfo

func NewImportInfo() *ImportInfo

type Issue

type Issue struct {
	Severity   Score  `json:"severity"`   // issue severity (how problematic it is)
	Confidence Score  `json:"confidence"` // issue confidence (how sure we are we found it)
	What       string `json:"details"`    // Human readable explanation
	File       string `json:"file"`       // File name we found it in
	Code       string `json:"code"`       // Impacted code line
	Line       int    `json:"line"`       // Line number in file

An Issue is returnd by a GAS rule if it discovers an issue with the scanned code.

func NewIssue

func NewIssue(ctx *Context, node ast.Node, desc string, severity Score, confidence Score) *Issue

NewIssue creates a new Issue

type MetaData

type MetaData struct {
	Severity   Score
	Confidence Score
	What       string

MetaData is embedded in all GAS rules. The Severity, Confidence and What message will be passed tbhrough to reported issues.

type Metrics

type Metrics struct {
	NumFiles int `json:"files"`
	NumLines int `json:"lines"`
	NumNosec int `json:"nosec"`
	NumFound int `json:"found"`

Metrics used when reporting information about a scanning run.

type Rule

type Rule interface {
	Match(ast.Node, *Context) (*Issue, error)

The Rule interface used by all rules supported by GAS.

type RuleSet

type RuleSet map[reflect.Type][]Rule

A RuleSet maps lists of rules to the type of AST node they should be run on. The anaylzer will only invoke rules contained in the list associated with the type of AST node it is currently visiting.

type Score

type Score int

Score type used by severity and confidence values

const (
	Low    Score = iota // Low value
	Medium              // Medium value
	High                // High value

func (Score) MarshalJSON

func (c Score) MarshalJSON() ([]byte, error)

MarshalJSON is used convert a Score object into a JSON representation

func (Score) String

func (c Score) String() string

String converts a Score into a string

type SelectFunc

type SelectFunc func(ast.Node, int) bool

SelectFunc is like an AST visitor, but has a richer interface. It is called with the current ast.Node being visitied and that nodes depth in the tree. The function can return true to continue traversing the tree, or false to end traversal here.

type Selector

type Selector interface {
	Partial(ast.Node) bool

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL