Upgrade to Pro — share decks privately, control downloads, hide ads and more …

今日から始めるカジュアルなソースコード解析 / 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)

Akira Goto

May 18, 2019
Tweet

Other Decks in Programming

Transcript

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

    日鉄ソリューションズ (NSSOL) Jenkinsおじさん JJUG イベント初参加 勉強会初登壇 初心者枠ありがとうございます!! 2
  2. JJUG CCC 2019 Spring #ccc_m6a ソースコード解析の分類 静的解析:ソースコードを実行せずに行う解析 - 字句解析 -

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

    という •構文解析の結果として抽象構文木が生成される 6 (参考) Java Language Specification https://docs.oracle.com/javase/specs/jls/se12/html/jls-19.html
  4. JJUG CCC 2019 Spring #ccc_m6a 抽象構文木 (Abstract Syntax Tree, AST)

    ソースコードの構文情報を木構造で表したもの 8 if文 条件式 month < 5 thenブロック elseブロック 代入文 era = "平成" 代入文 era = “令和"
  5. 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 出力 処理順
  6. JJUG CCC 2019 Spring #ccc_m6a ここまでまとめ •構文解析でソースコードから抽象構文木を生成 • JavaParserというライブラリで簡単に実現可能 •

    文字列を木構造に変換することで各種処理が容易 に実装できる •Visitorパターンに沿って独自処理を実装 • 実態は木構造の各ノードに対する処理 13
  7. JJUG CCC 2019 Spring #ccc_m6a 検索処理 以下のようなVisitor クラスを実装します Visitor 1

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

    120,996 ファイル 処理時間: 20 分 検索結果: 639 個 From
  9. JJUG CCC 2019 Spring #ccc_m6a ユースケースまとめ •抽象構文木を使った検索は "強い" • 検索処理をプログラム上で柔軟に実装

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