Save 37% off PRO during our Black Friday Sale! »

今日から始めるカジュアルなソースコード解析 / JJUG CCC 2019 Spring

今日から始めるカジュアルなソースコード解析 / JJUG CCC 2019 Spring

スライド中の各種リンク

・Java Language Specification (https://docs.oracle.com/javase/specs/jls/se12/html/jls-19.html)

・JavaParser (https://github.com/javaparser/javaparser)

・Qiita記事 (https://qiita.com/AkiraGoto/items/8e8cb6419d78d4e1d66a)

9ce7d5b9f57ec4dc8087ce57be9cce00?s=128

Akira Goto

May 18, 2019
Tweet

Transcript

  1. JJUG CCC 2019 Spring #ccc_m6a 今日から始める カジュアルなソースコード解析 2019/5/18 後藤 祥

    (Akira Goto) 1
  2. JJUG CCC 2019 Spring #ccc_m6a 自己紹介 後藤 祥 (Akira Goto)

    日鉄ソリューションズ (NSSOL) Jenkinsおじさん JJUG イベント初参加 勉強会初登壇 初心者枠ありがとうございます!! 2
  3. JJUG CCC 2019 Spring #ccc_m6a ソースコード解析について 3 全く知らない 聞いたことある、概要はわかる 解析処理をバリバリ書いてる

  4. JJUG CCC 2019 Spring #ccc_m6a 今日のセッションの目的 4 1. ソースコード解析の基本を知る 2.

    実際に書いてみようという気持ちになる
  5. JJUG CCC 2019 Spring #ccc_m6a ソースコード解析の分類 静的解析:ソースコードを実行せずに行う解析 - 字句解析 -

    構文解析 - 意味解析 - etc... 動的解析:ソースコードを実行して行う解析 - コードカバレッジ - 性能解析 - etc... 5 ここの話をします
  6. JJUG CCC 2019 Spring #ccc_m6a 構文解析 •ソースコードが構文規則に正しく従っているかを 判定する処理 •構文解析をするプログラムを構文解析器 (Parser)

    という •構文解析の結果として抽象構文木が生成される 6 (参考) Java Language Specification https://docs.oracle.com/javase/specs/jls/se12/html/jls-19.html
  7. JJUG CCC 2019 Spring #ccc_m6a JavaParser (https://github.com/javaparser/javaparser) オープンソースのJava解析用ライブラリ •シンプルかつ軽量で使いやすい •開発コミュニティが活発

    、ドキュメントも充実 •利用までの初期設定が簡単 7 ※本資料の説明内容もJavaParserが前提です
  8. JJUG CCC 2019 Spring #ccc_m6a 抽象構文木 (Abstract Syntax Tree, AST)

    ソースコードの構文情報を木構造で表したもの 8 if文 条件式 month < 5 thenブロック elseブロック 代入文 era = "平成" 代入文 era = “令和"
  9. JJUG CCC 2019 Spring #ccc_m6a やりたいことの実装 構文解析と抽象構文木の構築はライブラリを 使ってサクッとできます 抽象構文木に対する処理を実装することで、 やりたいことを実現します

    9
  10. JJUG CCC 2019 Spring #ccc_m6a Visitorパターン GoFのデザインパターンの1つ データの構造 と 処理

    を分離するパターン 10 抽象構文木 Visitorクラス
  11. JJUG CCC 2019 Spring #ccc_m6a Visitorの処理の流れ •抽象構文木のルートノードから処理を開始 •ノードを特定の順番に走査 •各ノードの訪問時に定義された処理を実行 11

  12. JJUG CCC 2019 Spring #ccc_m6a Visitorの処理 (図解) 12 Visitor クラス

    (抜粋) if文 条件式 month < 5 thenブロック elseブロック 代入文 era = "平成" 代入文 era = “令和" 1 3 2 4 6 5 IfStmt Expresion BlockStmt ExpressionStmt BlockStmt ExpressionStmt 出力 処理順
  13. JJUG CCC 2019 Spring #ccc_m6a ここまでまとめ •構文解析でソースコードから抽象構文木を生成 • JavaParserというライブラリで簡単に実現可能 •

    文字列を木構造に変換することで各種処理が容易 に実装できる •Visitorパターンに沿って独自処理を実装 • 実態は木構造の各ノードに対する処理 13
  14. JJUG CCC 2019 Spring #ccc_m6a ユースケース ここまでの話をベースにしたユースケースとし てソースコード検索の例を紹介します 14 Case

    1: Switch式に変換可能なSwitch文を探す https://qiita.com/AkiraGoto/items/8e8cb6419d78d4e1d66a
  15. JJUG CCC 2019 Spring #ccc_m6a Switch式 Java 12でPreview機能として使える 15

  16. JJUG CCC 2019 Spring #ccc_m6a 検索処理 以下のようなVisitor クラスを実装します Visitor 1

    抽象構文木からSwich文のノードを取得する Visitor 2 Switch式に変換可能かどうか判定する (同変数への代入文のみで構成されたSwitch文) 16
  17. JJUG CCC 2019 Spring #ccc_m6a 検索結果 17 調査対象: 100 プロジェクト

    120,996 ファイル 処理時間: 20 分 検索結果: 639 個 From
  18. JJUG CCC 2019 Spring #ccc_m6a 実例 18 jenkinsci/jenkins プロジェクト core/src/main/java/hudson/model/RunParameterDefinition.java

    より
  19. JJUG CCC 2019 Spring #ccc_m6a ユースケースまとめ •抽象構文木を使った検索は "強い" • 検索処理をプログラム上で柔軟に実装

    • コメントや文字リテラルの影響を受けない •問題のあるコードの検出にも適用可 • 自動レビューのようなことが実現可能 •検索以外のユースケースもある • 機械学習の前処理としてソースコードをベクトル 表現に変換したりなどなど 19
  20. JJUG CCC 2019 Spring #ccc_m6a まとめ 20 ソースコード解析は 難しくない ソースコード解析は

    日常使いできる ソースコード解析は もっと奥が深い