Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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 ソースコード解析は 難しくない ソースコード解析は 日常使いできる ソースコード解析は もっと奥が深い