analyzer

package
v1.1.1 Latest Latest
Warning

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

Go to latest
Published: Sep 1, 2025 License: MIT Imports: 10 Imported by: 0

Documentation

Index

Constants

View Source
const (
	ReadWriteTransactionType = "ReadWriteTransaction"
	ReadOnlyTransactionType  = "ReadOnlyTransaction"
)

Spannerトランザクション種別定数

Variables

View Source
var Analyzer = &analysis.Analyzer{
	Name: "gcpclosecheck",
	Doc:  "detect missing Close/Stop/Cancel calls for GCP resources",
	Run:  run,
}

Analyzer は GCP リソースの解放漏れを検出する静的解析ツール

Functions

This section is empty.

Types

type CleanupMethod

type CleanupMethod struct {
	Method      string `yaml:"method"`      // メソッド名
	Required    bool   `yaml:"required"`    // 必須かどうか
	Description string `yaml:"description"` // 説明
}

CleanupMethod は解放メソッドの詳細情報を表す

type ContextAnalyzer

type ContextAnalyzer struct {
	// contains filtered or unexported fields
}

ContextAnalyzer はcontext.WithCancel/WithTimeout検出とキャンセレーション検証を行う

func NewContextAnalyzer

func NewContextAnalyzer() *ContextAnalyzer

NewContextAnalyzer は新しいContextAnalyzerを作成する

func (*ContextAnalyzer) AnalyzeContextUsage

func (ca *ContextAnalyzer) AnalyzeContextUsage(file *ast.File, typeInfo *types.Info) error

AnalyzeContextUsage は改良されたcontext使用解析を実行する

func (*ContextAnalyzer) FindMissingCancels

func (ca *ContextAnalyzer) FindMissingCancels(pass *analysis.Pass) []analysis.Diagnostic

FindMissingCancels はanalysis.Passを使用してキャンセル漏れを検出する

func (*ContextAnalyzer) GetTrackedContextVars

func (ca *ContextAnalyzer) GetTrackedContextVars() []ContextInfo

GetTrackedContextVars は追跡中のcontext変数一覧を取得する(テスト用)

func (*ContextAnalyzer) IsContextWithCancel

func (ca *ContextAnalyzer) IsContextWithCancel(funcName string) bool

IsContextWithCancel は関数名がキャンセル関数を返すcontext関数かどうかを判定する

func (*ContextAnalyzer) TrackContextCreation

func (ca *ContextAnalyzer) TrackContextCreation(call *ast.CallExpr, typeInfo *types.Info) error

TrackContextCreation はcontext生成関数を解析してキャンセル関数を追跡する

type ContextInfo

type ContextInfo struct {
	Variable    *types.Var        // context 変数
	CancelFunc  *types.Var        // cancel 関数
	CreationPos token.Pos         // 生成位置
	IsDeferred  bool              // defer で呼ばれているかどうか
	DeferInfos  []DeferCancelInfo // defer情報のリスト(複数のdeferに対応)
}

ContextInfo は context.WithCancel/WithTimeout の追跡情報を表す

func NewContextInfo

func NewContextInfo(variable, cancelFunc *types.Var, creationPos token.Pos, isDeferred bool) *ContextInfo

NewContextInfo は ContextInfo のコンストラクタ

func (*ContextInfo) AddDeferInfo

func (c *ContextInfo) AddDeferInfo(deferInfo *DeferCancelInfo)

AddDeferInfo は新しいdefer情報を追加する(複数対応)

func (*ContextInfo) GetAllDeferInfos

func (c *ContextInfo) GetAllDeferInfos() []DeferCancelInfo

GetAllDeferInfos は全てのdefer情報を取得する

func (*ContextInfo) GetDeferInfo

func (c *ContextInfo) GetDeferInfo() *DeferCancelInfo

GetDeferInfo は最初のdefer情報を取得する(後方互換性のため)

func (*ContextInfo) HasDeferInfo

func (c *ContextInfo) HasDeferInfo() bool

HasDeferInfo は defer情報が設定されているかどうかを判定する

func (*ContextInfo) SetDeferInfo

func (c *ContextInfo) SetDeferInfo(deferInfo *DeferCancelInfo)

SetDeferInfo は単一のdefer情報を設定する(既存の情報を置き換え)

func (*ContextInfo) Validate

func (c *ContextInfo) Validate() error

Validate は ContextInfo の妥当性を検証する

type DeferAnalyzer

type DeferAnalyzer struct {
	// contains filtered or unexported fields
}

DeferAnalyzer はdefer文を解析してリソースの適切な解放を検証する

func NewDeferAnalyzer

func NewDeferAnalyzer(tracker *ResourceTracker) *DeferAnalyzer

NewDeferAnalyzer は新しいDeferAnalyzerを作成する

func (*DeferAnalyzer) AnalyzeDefers

func (da *DeferAnalyzer) AnalyzeDefers(fn *ast.FuncDecl, resources []ResourceInfo) []analysis.Diagnostic

AnalyzeDefers は関数内のdefer文を解析して診断を生成する(外部からリソースリストを受け取る)

func (*DeferAnalyzer) AnalyzeDefersPrecision

func (da *DeferAnalyzer) AnalyzeDefersPrecision(block *ast.BlockStmt) []DeferInfo

AnalyzeDefersPrecision は改良されたdefer文の精密解析を実行する

func (*DeferAnalyzer) FindBestMatchingDefer

func (da *DeferAnalyzer) FindBestMatchingDefer(resource ResourceInfo, defers []*ast.DeferStmt) *ast.DeferStmt

FindBestMatchingDefer は位置に基づいてリソースに最適なdefer文を見つける

func (*DeferAnalyzer) FindDeferStatements

func (da *DeferAnalyzer) FindDeferStatements(block *ast.BlockStmt) []*ast.DeferStmt

FindDeferStatements はブロック内のdefer文を再帰的に検索する

func (*DeferAnalyzer) HasMatchingVariableName

func (da *DeferAnalyzer) HasMatchingVariableName(deferStmt *ast.DeferStmt, resource ResourceInfo) bool

HasMatchingVariableName はdefer文の変数名がリソースと一致するかチェック

func (*DeferAnalyzer) IsAddedToDeferArray

func (da *DeferAnalyzer) IsAddedToDeferArray(block *ast.BlockStmt, resource ResourceInfo) bool

IsAddedToDeferArray はリソースがdefers配列に追加されているかチェック

func (*DeferAnalyzer) IsExpectedCleanupMethod

func (da *DeferAnalyzer) IsExpectedCleanupMethod(deferStmt *ast.DeferStmt, expectedMethod string) bool

IsExpectedCleanupMethod はdefer文が期待されるクリーンアップメソッドかチェック

func (*DeferAnalyzer) ValidateCleanupOrder

func (da *DeferAnalyzer) ValidateCleanupOrder(block *ast.BlockStmt) bool

ValidateCleanupOrder はdefer文の順序が適切かを検証する Goのdeferはスタック(LIFO)なので、依存関係の逆順で呼び出される

func (*DeferAnalyzer) ValidateCleanupPattern

func (da *DeferAnalyzer) ValidateCleanupPattern(resource ResourceInfo, deferStmt *ast.DeferStmt) bool

ValidateCleanupPattern はリソースとdefer文が適切にマッチするかを検証する

func (*DeferAnalyzer) ValidateDeferScope

func (da *DeferAnalyzer) ValidateDeferScope(block *ast.BlockStmt) bool

ValidateDeferScope はdefer文のスコープ妥当性を検証

type DeferCancelInfo

type DeferCancelInfo struct {
	CancelVarName string    // cancel変数名
	DeferPos      token.Pos // defer文の位置
	ScopeDepth    int       // スコープの深さ
	IsValid       bool      // defer文が有効かどうか
}

DeferCancelInfo は defer cancel() 呼び出しの情報を表す

func NewDeferCancelInfo

func NewDeferCancelInfo(cancelVarName string, deferPos token.Pos, scopeDepth int, isValid bool) *DeferCancelInfo

NewDeferCancelInfo は DeferCancelInfo のコンストラクタ

func (*DeferCancelInfo) Validate

func (d *DeferCancelInfo) Validate() error

Validate は DeferCancelInfo の妥当性を検証する

type DeferInfo

type DeferInfo struct {
	DeferStmt    *ast.DeferStmt
	ResourceType string
	Method       string
	ScopeDepth   int  // スコープの深さ
	IsValid      bool // defer文が有効かどうか
}

DeferInfo はdefer文に関する情報を保持する

type DiagnosticGenerator

type DiagnosticGenerator struct {
	// contains filtered or unexported fields
}

DiagnosticGenerator は診断レポートを生成する

func NewDiagnosticGenerator

func NewDiagnosticGenerator(fset *token.FileSet) *DiagnosticGenerator

NewDiagnosticGenerator は新しいDiagnosticGeneratorを作成する

func (*DiagnosticGenerator) CreateSuggestedFix

func (dg *DiagnosticGenerator) CreateSuggestedFix(variableName, method string, creationPos token.Pos) analysis.SuggestedFix

CreateSuggestedFix はdefer文追加の修正提案を作成する

func (*DiagnosticGenerator) GenerateLocationInfo

func (dg *DiagnosticGenerator) GenerateLocationInfo(pos token.Pos) string

GenerateLocationInfo はファイル位置情報を含む詳細な診断情報を生成する

func (*DiagnosticGenerator) ReportMissingContextCancel

func (dg *DiagnosticGenerator) ReportMissingContextCancel(contextInfo ContextInfo) analysis.Diagnostic

ReportMissingContextCancel はcontext.WithCancelのキャンセル関数が不足している診断を生成する

func (*DiagnosticGenerator) ReportMissingDefer

func (dg *DiagnosticGenerator) ReportMissingDefer(resource ResourceInfo) analysis.Diagnostic

ReportMissingDefer はdefer文が不足しているリソースの診断を生成する

func (*DiagnosticGenerator) ShouldIgnoreNolint

func (dg *DiagnosticGenerator) ShouldIgnoreNolint(file *ast.File, pos token.Pos) bool

ShouldIgnoreNolint はnolintディレクティブをチェックし、診断を抑制すべきかどうかを判定する

type EscapeAnalyzer

type EscapeAnalyzer struct {
	// contains filtered or unexported fields
}

EscapeAnalyzer はリソースの逃げパス(戻り値、フィールド代入)を解析する

func NewEscapeAnalyzer

func NewEscapeAnalyzer() *EscapeAnalyzer

NewEscapeAnalyzer は新しいEscapeAnalyzerを作成する

func (*EscapeAnalyzer) AnalyzeEscape

func (ea *EscapeAnalyzer) AnalyzeEscape(variable *types.Var, fn *ast.FuncDecl) EscapeInfo

AnalyzeEscape は変数のエスケープパターンを解析する

func (*EscapeAnalyzer) DetectSpannerAutoManagement

func (ea *EscapeAnalyzer) DetectSpannerAutoManagement(variable *types.Var, fn *ast.FuncDecl) *SpannerEscapeInfo

DetectSpannerAutoManagement は Spannerトランザクションの自動管理パターンを検出する

func (*EscapeAnalyzer) HasSpannerEscapeInfo

func (ea *EscapeAnalyzer) HasSpannerEscapeInfo(variable *types.Var) bool

HasSpannerEscapeInfo はSpannerエスケープ情報がキャッシュされているかを確認する

func (*EscapeAnalyzer) IsFieldAssigned

func (ea *EscapeAnalyzer) IsFieldAssigned(variable *types.Var, fn *ast.FuncDecl) bool

IsFieldAssigned は変数が構造体のフィールドに代入されるかどうかを判定する

func (*EscapeAnalyzer) IsReturnedValue

func (ea *EscapeAnalyzer) IsReturnedValue(variable *types.Var, fn *ast.FuncDecl) bool

IsReturnedValue は変数が関数の戻り値として返されるかどうかを判定する

func (*EscapeAnalyzer) IsSpannerClosurePattern

func (ea *EscapeAnalyzer) IsSpannerClosurePattern(variable *types.Var, fn *ast.FuncDecl) (bool, string)

IsSpannerClosurePattern は変数がSpannerクロージャパターンで使用されているかを検出する

func (*EscapeAnalyzer) ShouldSkipResource

func (ea *EscapeAnalyzer) ShouldSkipResource(resource ResourceInfo, escape EscapeInfo) (bool, string)

ShouldSkipResource はリソースをスキップすべきかどうかを判定する

type EscapeInfo

type EscapeInfo struct {
	IsReturned      bool   // 関数戻り値として返されるか
	IsFieldAssigned bool   // 構造体フィールドに代入されるか
	EscapeReason    string // 逃げる理由の説明
}

EscapeInfo は変数の逃げパス(return/field格納)情報を表す

func NewEscapeInfo

func NewEscapeInfo(isReturned, isFieldAssigned bool, reason string) *EscapeInfo

NewEscapeInfo は EscapeInfo のコンストラクタ

func (*EscapeInfo) HasEscaped

func (e *EscapeInfo) HasEscaped() bool

HasEscaped は変数が逃げているかどうかを判定する

type ResourceInfo

type ResourceInfo struct {
	Variable         *types.Var         // 変数の型情報
	VariableName     string             // 変数名(文字列)
	CreationPos      token.Pos          // 生成位置
	ServiceType      string             // GCP サービスタイプ(spanner, storage, pubsub 等)
	CreationFunction string             // 生成関数名(NewClient, ReadOnlyTransaction 等)
	CleanupMethod    string             // 解放メソッド名(Close, Stop, Cleanup)
	IsRequired       bool               // 解放が必須かどうか
	Scope            *types.Scope       // 変数のスコープ
	SpannerEscape    *SpannerEscapeInfo // Spannerエスケープ情報(Spannerリソースのみ)
}

ResourceInfo は GCP リソースの生成情報と解放要求を表す

func NewResourceInfo

func NewResourceInfo(variable *types.Var, creationPos token.Pos, serviceType, creationFunction, cleanupMethod string, isRequired bool, scope *types.Scope) *ResourceInfo

NewResourceInfo は ResourceInfo のコンストラクタ

func (*ResourceInfo) GetSpannerEscape

func (r *ResourceInfo) GetSpannerEscape() *SpannerEscapeInfo

GetSpannerEscape は SpannerEscapeInfo を取得する

func (*ResourceInfo) HasSpannerEscape

func (r *ResourceInfo) HasSpannerEscape() bool

HasSpannerEscape は SpannerEscapeInfo が設定されているかどうかを判定する

func (*ResourceInfo) SetSpannerEscape

func (r *ResourceInfo) SetSpannerEscape(escape *SpannerEscapeInfo)

SetSpannerEscape は SpannerEscapeInfo を設定する

func (*ResourceInfo) ShouldSkipSpannerCleanup

func (r *ResourceInfo) ShouldSkipSpannerCleanup() bool

ShouldSkipSpannerCleanup は、Spannerリソースの解放処理をスキップすべきかどうかを判定する

func (*ResourceInfo) Validate

func (r *ResourceInfo) Validate() error

Validate は ResourceInfo の妥当性を検証する

type ResourceTracker

type ResourceTracker struct {
	// contains filtered or unexported fields
}

ResourceTracker はGCPリソースの生成を追跡する

func NewResourceTracker

func NewResourceTracker(typeInfo *types.Info, ruleEngine *ServiceRuleEngine) *ResourceTracker

NewResourceTracker は新しいResourceTrackerを作成する

func (*ResourceTracker) ClearTrackedResources

func (rt *ResourceTracker) ClearTrackedResources()

ClearTrackedResources は追跡中のリソースをクリアする

func (*ResourceTracker) FilterAutoManagedResources

func (rt *ResourceTracker) FilterAutoManagedResources(resources []*ResourceInfo) []*ResourceInfo

FilterAutoManagedResources は自動管理されるリソースをフィルタリングして除外する

func (*ResourceTracker) FindResourceCreation

func (rt *ResourceTracker) FindResourceCreation(pass *analysis.Pass) []ResourceInfo

FindResourceCreation はanalysis.Passを使用してリソース生成を検出する

func (*ResourceTracker) GetPackageInfo

func (rt *ResourceTracker) GetPackageInfo(packagePath string) (bool, string)

GetPackageInfo はパッケージパスからGCP情報を取得する

func (*ResourceTracker) GetTrackedResources

func (rt *ResourceTracker) GetTrackedResources() []ResourceInfo

GetTrackedResources は追跡中のリソース一覧を取得する

func (*ResourceTracker) IntegrateSpannerEscape

func (rt *ResourceTracker) IntegrateSpannerEscape(resourceInfo *ResourceInfo, escapeAnalyzer *EscapeAnalyzer, funcDecl *ast.FuncDecl)

IntegrateSpannerEscape はSpannerエスケープ解析結果をResourceInfoに統合する

func (*ResourceTracker) IsResourceType

func (rt *ResourceTracker) IsResourceType(typ types.Type) (bool, string)

IsResourceType は型がGCPリソース型かどうかを判定する

func (*ResourceTracker) IsResourceTypeByName

func (rt *ResourceTracker) IsResourceTypeByName(typeName string) (bool, string)

IsResourceTypeByName は型名からGCPリソース型かどうかを判定する

func (*ResourceTracker) TrackCall

func (rt *ResourceTracker) TrackCall(call *ast.CallExpr) error

TrackCall は関数呼び出しを解析してGCPリソース生成を追跡する

type ServiceRule

type ServiceRule struct {
	ServiceName    string          `yaml:"service_name"`       // サービス名
	PackagePath    string          `yaml:"package_path"`       // パッケージパス
	CreationFuncs  []string        `yaml:"creation_functions"` // 生成関数一覧
	CleanupMethods []CleanupMethod `yaml:"cleanup_methods"`    // 解放メソッド一覧
}

ServiceRule は GCP サービス固有の解放ルール定義を表す

func (*ServiceRule) GetRequiredCleanupMethods

func (s *ServiceRule) GetRequiredCleanupMethods() []CleanupMethod

GetRequiredCleanupMethods は必須の解放メソッド一覧を返す

func (*ServiceRule) HasCreationFunc

func (s *ServiceRule) HasCreationFunc(funcName string) bool

HasCreationFunc は指定された関数名が生成関数に含まれるかチェックする

type ServiceRuleEngine

type ServiceRuleEngine struct {
	// contains filtered or unexported fields
}

ServiceRuleEngine はGCPサービスルールの管理エンジン

func NewServiceRuleEngine

func NewServiceRuleEngine() *ServiceRuleEngine

NewServiceRuleEngine は新しいServiceRuleEngineを作成する

func (*ServiceRuleEngine) GetCleanupMethod

func (sre *ServiceRuleEngine) GetCleanupMethod(serviceType string) (string, bool)

GetCleanupMethod は指定されたサービスタイプの解放メソッドを取得する

func (*ServiceRuleEngine) GetServiceRule

func (sre *ServiceRuleEngine) GetServiceRule(serviceName string) *ServiceRule

GetServiceRule はサービス名からServiceRuleを取得する

func (*ServiceRuleEngine) IsCleanupRequired

func (sre *ServiceRuleEngine) IsCleanupRequired(serviceType string) bool

IsCleanupRequired は指定されたサービスタイプで解放が必須かを判定する

func (*ServiceRuleEngine) LoadDefaultRules

func (sre *ServiceRuleEngine) LoadDefaultRules() error

LoadDefaultRules はデフォルト設定を読み込む

func (*ServiceRuleEngine) LoadPackageExceptions

func (sre *ServiceRuleEngine) LoadPackageExceptions(configPath string) error

LoadPackageExceptions はパッケージ例外設定を読み込む 設定がない場合、またはパッケージ例外が定義されていない場合でもエラーにならない

func (*ServiceRuleEngine) LoadRules

func (sre *ServiceRuleEngine) LoadRules(configPath string) error

LoadRules は設定ファイルからルールを読み込む configPathが空またはファイルが存在しない場合はデフォルト設定を使用

func (*ServiceRuleEngine) ShouldExemptPackage

func (sre *ServiceRuleEngine) ShouldExemptPackage(packagePath string) (bool, string)

ShouldExemptPackage は指定されたパッケージパスが例外対象かを判定する

type SpannerEscapeInfo

type SpannerEscapeInfo struct {
	IsAutoManaged        bool   // フレームワークによる自動管理かどうか
	TransactionType      string // トランザクション種別(ReadWriteTransaction/ReadOnlyTransaction)
	IsClosureManaged     bool   // クロージャ内で管理されているか
	ClosureDetected      bool   // クロージャパターンが検出されたか
	AutoManagementReason string // 自動管理の理由
}

SpannerEscapeInfo は Spannerリソースの自動管理情報を表す

func NewSpannerEscapeInfo

func NewSpannerEscapeInfo(transactionType string, isAutoManaged bool, reason string) *SpannerEscapeInfo

NewSpannerEscapeInfo は SpannerEscapeInfo のコンストラクタ

func (*SpannerEscapeInfo) ShouldSkipCleanup

func (s *SpannerEscapeInfo) ShouldSkipCleanup() bool

ShouldSkipCleanup は、このSpannerリソースの解放処理をスキップすべきかどうかを判定する

func (*SpannerEscapeInfo) Validate

func (s *SpannerEscapeInfo) Validate() error

Validate は SpannerEscapeInfo の妥当性を検証する

Jump to

Keyboard shortcuts

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