ruleanalyzer

package module
v0.0.0-...-81f7889 Latest Latest
Warning

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

Go to latest
Published: Sep 14, 2020 License: MIT Imports: 15 Imported by: 0

README

ruleanalyzer

exampleのようにルールを記述したコードから静的解析用のAnalyzerを生成するツール

インストール

go get -u github.com/tetsuzawa/ruleanalyzer/cmd/ruleanalyzer

使い方

  1. ルールを記述したファイルをtestdata以下に作る。(コンパイルに含まれなければどこでも良い)

    func RuleOsOpen() {
        // step: call os.Open
        f, _ := os.Open("xxx")
        // step: call *File.close
        defer f.Close()
    }
    
  2. ruleanalyzerを実行する

    ruleanalyzer testdata/src/osopen/osopen_rule.go
    
  3. カレントディレクトリ以下にルール名のディレクトリ作成され、中にAnalyzerが生成される。

    var Analyzer = &analysis.Analyzer{
        Name: "OsOpen",
        Doc:  doc,
        Run:  run,
        Requires: []*analysis.Analyzer{
           buildssa.Analyzer,
        },
    }
    
    const ruleName = "OsOpen"
    
    func run(pass *analysis.Pass) (interface{}, error) {
       /* ...*/
    
  4. ルールからはステップに応じたマイルストーンが生成されており、Analyzerではマイルストーンが全て達成されたかを調べる。マイルストーンが全て達成されていなければログが表示される。

ルールのフォーマット

  • 関数名はRuleXxxのようにRuleで始める
  • 各ステップの処理を次のフォーマットのコメントの次の行に書く
    // step: xxxxxxx
  • コメントの後に複数行の処理を書いても必要なステップとして認識されるのは直後の行のみである。

コード生成までの原理

ルール解析

  1. ルールが記述された関数をSSA形式に変換する
  2. 特定フォーマットのコメント直後の命令から*types.Objectを取り出し、MilestoneQueueに追加する。

コード生成

  1. *types.Objectからパッケージ名、型名、オブジェクト名などを取得する
  2. これらの情報を元にAnalyzer内でオブジェクトを再取得するコードを構築する
  3. テンプレートを使用し、ソースコードを組み立てる。

依存ライブラリ・コマンド

  • golang.org/x/tools/go
  • golang.org/x/tools/cmd/goimports
  • github.com/gostaticanalysis/analysisutil

TODO

  • 対応する命令を増やす
    現状、*ssa.Call*ssa.Alloc*ssa.Deferのみしか命令を処理できていないため、宣言をはじめとする他の命令にも対応したい
  • 各ステップで作られた変数を追従し、その後のステップと結びつけられるようにする
    現状、変数と関数呼び出しなどの対応付けができていない状態である。元のコードのSSA形式の構造を生成したAnalyzerに持ち込む方法を思いついていないので考えたい。
  • インターフェースのメソッド呼び出しに対応する
    インターフェースからの呼び出しはポインタ解析が必要となり、現状対応できていない。
  • コードのリファクタ
    時間が限られていたためパッケージ構成やファイル分けが雑になってしまっている。また、テストも書けていないため追加したい。

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Alloc

func Alloc(instr *ssa.Alloc, f *types.TypeName) bool

func BinOp

func BinOp(instr *ssa.BinOp, recv ssa.Value, f *types.Func) bool

func Defer

func Defer(instr *ssa.Defer, recv ssa.Value, f *types.Func) bool

func Func

func Func(instr ssa.CallInstruction, recv ssa.Value, f *types.Func) bool

func Run

func Run() error

Types

type MilestoneQueue

type MilestoneQueue []types.Object

func (*MilestoneQueue) Head

func (q *MilestoneQueue) Head() types.Object

func (*MilestoneQueue) Len

func (q *MilestoneQueue) Len() int

func (*MilestoneQueue) Pop

func (q *MilestoneQueue) Pop() (t types.Object)

func (*MilestoneQueue) Push

func (q *MilestoneQueue) Push(t types.Object)

func (*MilestoneQueue) Tail

func (q *MilestoneQueue) Tail() types.Object

type TplConfig

type TplConfig struct {
	Name  string
	Queue MilestoneQueue
}

func NewTplConfig

func NewTplConfig(name string, q MilestoneQueue) *TplConfig

Directories

Path Synopsis
cmd

Jump to

Keyboard shortcuts

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