Skip to content

Instantly share code, notes, and snippets.

@muroon
Last active January 31, 2020 12:30
Show Gist options
  • Save muroon/a1099f492f39682138dd8e3c45bd4bc7 to your computer and use it in GitHub Desktop.
Save muroon/a1099f492f39682138dd8e3c45bd4bc7 to your computer and use it in GitHub Desktop.

zaganeとの格闘

memo_sample_spannerzaganeをかけてチェックをしたときの話

zaganeをかけてみる

zaganeはCloud Spannerの使用しているプロジェクト内の下記の処理漏れを検知してくれるツール

  • ReadOnlyTransactionのClose漏れ
  • 検索結果のiteretorのClose漏れ
  • (ReadWreteTransaction内でのWrapError検知 ※解決済)

zaganeによるチェックを行うと下記のようなReadOnlyTransactionのClose漏れの指摘が表示される

# memo_sample_spanner/infra/cloudspanner
-: transaction must be closed
-: transaction must be closed
-: transaction must be closed
-: transaction must be closed
-: transaction must be closed

理由はmemo_sample_spanner/infra/cloudspanner内に定義されている下記のメソッドにてReadOnlyTransactionの未Closeが指摘されている模様

  • ReadRow
  • Read
  • ReadUsingIndex
  • Query
  • Apply

zaganeではReadOnlyTransactionの未CloseはspannerパッケージのReadOnlyTransactionの次のSSA Instructure(字句トークンの集合)でClose()が実行されていないとアラートを発生させる

上記でも述べたとおり、memo_sample_spannerではCloud SpannerへのアクセスメソッドはTransaction内外でも共通にCloud Spannerへのクエリが実行可能なつくり

仕様に則って使用している限りこちらのReadOnlyTransactionメソッド経由でしかReadOnlyTransaction使用できない。内部でdefer tx.Close()を実行しているのでCloseが漏れることはない(※仕様無視した使用法は別)

よってローカルルールではあるが指摘を受けている該当のメソッドはReadOnlyTransaction内で使用されることを前提としたメソッドのため無視しても差し支えないと判断する

チェック対象から外す

本家のzaganeの仕様では下記のようなコメントを書くとunclosetx検査対象から除外することが可能である

//lint:ignore unclosetx

https://github.com/gcpug/zagane/blob/master/passes/unclosetx/unclosetx.go#L68

ただし、memo_sample_spannerのinfra/cloudspanner配下ReadOnlyTransactionを使用してる各所に上記のコメントの記載しても検査対象からうまく除外してくれない

原因は検出されるtokenのPosition情報がIsValied:falseの状態であるため CommentMapのCommentsByPosメソッドにてコメントが取得できないためである https://github.com/gostaticanalysis/comment/blob/master/comment.go#L32

どうしてPositionがInvalidになってしまうかは今後も継続して調査する(2020.1.17)

v0.3.4にて修正されたました。

専用チェッカー

できれば本家のほうで対応したかったが、 誤って今後わけのわからない開発をしてしまった場合に備えてmemo_sample_spanner専用のzagane同様のチェックツールを下記に用意する

https://github.com/muroon/memo_sample_spanner_analyzer

内容は、基本的にはzaganeのAnalyzerをそのまま利用していて、ReadOnlyTransactionのクローズチェックのみ、 上記のmemo_sample_spanner/infra/cloudspanner上の該当メソッドのみチェック対象から除外して対応

  • analysis.Analyzerは他のanalysis.Analyzerと組み合わせて使用することができる
  • memo_sample_spanner専用のAnalyzerにて該当メソッドを除外してから本家のunclosetx.Analyzer実行
  • 意図した仕様とは異なるが該当メソッド以外でspannerのReadOnlyTransactionを直接読んで使用したときなどの検出に利用できる

本家の修正と書き方がイケてなかったところの修正によりこのツール自体は不要となりました(2020.1.31)

@muroon
Copy link
Author

muroon commented Jan 31, 2020

@tenntenn
ご対応ありがとうございました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment