Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

JJUG CCC 2019 Spring #ccc_m6a 自己紹介 後藤 祥 (Akira Goto) 日鉄ソリューションズ (NSSOL) Jenkinsおじさん JJUG イベント初参加 勉強会初登壇 初心者枠ありがとうございます!! 2

Slide 3

Slide 3 text

JJUG CCC 2019 Spring #ccc_m6a ソースコード解析について 3 全く知らない 聞いたことある、概要はわかる 解析処理をバリバリ書いてる

Slide 4

Slide 4 text

JJUG CCC 2019 Spring #ccc_m6a 今日のセッションの目的 4 1. ソースコード解析の基本を知る 2. 実際に書いてみようという気持ちになる

Slide 5

Slide 5 text

JJUG CCC 2019 Spring #ccc_m6a ソースコード解析の分類 静的解析:ソースコードを実行せずに行う解析 - 字句解析 - 構文解析 - 意味解析 - etc... 動的解析:ソースコードを実行して行う解析 - コードカバレッジ - 性能解析 - etc... 5 ここの話をします

Slide 6

Slide 6 text

JJUG CCC 2019 Spring #ccc_m6a 構文解析 •ソースコードが構文規則に正しく従っているかを 判定する処理 •構文解析をするプログラムを構文解析器 (Parser) という •構文解析の結果として抽象構文木が生成される 6 (参考) Java Language Specification https://docs.oracle.com/javase/specs/jls/se12/html/jls-19.html

Slide 7

Slide 7 text

JJUG CCC 2019 Spring #ccc_m6a JavaParser (https://github.com/javaparser/javaparser) オープンソースのJava解析用ライブラリ •シンプルかつ軽量で使いやすい •開発コミュニティが活発 、ドキュメントも充実 •利用までの初期設定が簡単 7 ※本資料の説明内容もJavaParserが前提です

Slide 8

Slide 8 text

JJUG CCC 2019 Spring #ccc_m6a 抽象構文木 (Abstract Syntax Tree, AST) ソースコードの構文情報を木構造で表したもの 8 if文 条件式 month < 5 thenブロック elseブロック 代入文 era = "平成" 代入文 era = “令和"

Slide 9

Slide 9 text

JJUG CCC 2019 Spring #ccc_m6a やりたいことの実装 構文解析と抽象構文木の構築はライブラリを 使ってサクッとできます 抽象構文木に対する処理を実装することで、 やりたいことを実現します 9

Slide 10

Slide 10 text

JJUG CCC 2019 Spring #ccc_m6a Visitorパターン GoFのデザインパターンの1つ データの構造 と 処理 を分離するパターン 10 抽象構文木 Visitorクラス

Slide 11

Slide 11 text

JJUG CCC 2019 Spring #ccc_m6a Visitorの処理の流れ •抽象構文木のルートノードから処理を開始 •ノードを特定の順番に走査 •各ノードの訪問時に定義された処理を実行 11

Slide 12

Slide 12 text

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 出力 処理順

Slide 13

Slide 13 text

JJUG CCC 2019 Spring #ccc_m6a ここまでまとめ •構文解析でソースコードから抽象構文木を生成 • JavaParserというライブラリで簡単に実現可能 • 文字列を木構造に変換することで各種処理が容易 に実装できる •Visitorパターンに沿って独自処理を実装 • 実態は木構造の各ノードに対する処理 13

Slide 14

Slide 14 text

JJUG CCC 2019 Spring #ccc_m6a ユースケース ここまでの話をベースにしたユースケースとし てソースコード検索の例を紹介します 14 Case 1: Switch式に変換可能なSwitch文を探す https://qiita.com/AkiraGoto/items/8e8cb6419d78d4e1d66a

Slide 15

Slide 15 text

JJUG CCC 2019 Spring #ccc_m6a Switch式 Java 12でPreview機能として使える 15

Slide 16

Slide 16 text

JJUG CCC 2019 Spring #ccc_m6a 検索処理 以下のようなVisitor クラスを実装します Visitor 1 抽象構文木からSwich文のノードを取得する Visitor 2 Switch式に変換可能かどうか判定する (同変数への代入文のみで構成されたSwitch文) 16

Slide 17

Slide 17 text

JJUG CCC 2019 Spring #ccc_m6a 検索結果 17 調査対象: 100 プロジェクト 120,996 ファイル 処理時間: 20 分 検索結果: 639 個 From

Slide 18

Slide 18 text

JJUG CCC 2019 Spring #ccc_m6a 実例 18 jenkinsci/jenkins プロジェクト core/src/main/java/hudson/model/RunParameterDefinition.java より

Slide 19

Slide 19 text

JJUG CCC 2019 Spring #ccc_m6a ユースケースまとめ •抽象構文木を使った検索は "強い" • 検索処理をプログラム上で柔軟に実装 • コメントや文字リテラルの影響を受けない •問題のあるコードの検出にも適用可 • 自動レビューのようなことが実現可能 •検索以外のユースケースもある • 機械学習の前処理としてソースコードをベクトル 表現に変換したりなどなど 19

Slide 20

Slide 20 text

JJUG CCC 2019 Spring #ccc_m6a まとめ 20 ソースコード解析は 難しくない ソースコード解析は 日常使いできる ソースコード解析は もっと奥が深い