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

golang.org/x/tools/go/analysisで静的解析ツールを自作する #gounco / how to create the static analysis tool for go

golang.org/x/tools/go/analysisで静的解析ツールを自作する #gounco / how to create the static analysis tool for go

golang.org/x/tools/go/analysisの簡単な使い方と実際に静的解析ツールの作成する流れを説明します。

詳細はブログに書いてあります。
https://budougumi0617.github.io/2019/02/01/how-to-use-analisys-package/

- Go(Un)Conference(Goあんこ)LT大会 5kg
- https://gounconference.connpass.com/event/112942/

Yoichiro Shimizu

January 31, 2019
Tweet

More Decks by Yoichiro Shimizu

Other Decks in Technology

Transcript

  1. x/tools/go/analysisで
    静的解析ツールを自作する
    (P 6O
    $POGFSFODF (P͋Μ͜
    -5େձLH
    :PJDIJSP4IJNJ[V!CVEPVHVNJ

    View Slide

  2. 自己紹介
    ‣ ਗ਼ਫཅҰ࿠!CVEPVHVNJ

    ‣ #BDLFOE%FTLUPQ"QQFOHJOFFS
    ‣ (P3VCZPO3BJMT/&5
    ‣ ϒϩάIUUQCVEPVHVNJHJUIVCJP
    ‣ ίϛϡχςΟ׆ಈ(P$POGFSFODFHPMBOHUPLZP

    View Slide

  3. 今日のゴール
    ‣ HPMBOHPSHYUPPMTHPBOBMZTJTQLHͷ֓ཁΛ஌Δ
    ‣ (Pͷ੩తղੳίϚϯυͷ࣮૷ͷ࢓ํΛ஌Δ

    View Slide

  4. アジェンダ
    ‣ HPMBOHPSHYUPPMTHPBOBMZTJTύοέʔδͷओཁͳ֓೦Λ஌Δ
    ‣ "OBMZ[FS1BTT
    ‣ %JBHOPTUJD'BDU3FTVMU
    ‣ (Pͷ੩తղੳίϚϯυͷ࣮૷ͷྲྀΕΛ௥͏

    View Slide

  5. 最初に
    ‣ HPWFUHPJNQPSUTFSSDIFDLͳͲɺ(P͸੩తղੳπʔϧ͕๛෋
    ‣ ࣾ಺ίʔσΟϯάϧʔϧ९कΛ֬ೝ͢Δ੩తղੳπʔϧΛ࡞Γ͍ͨ

    View Slide

  6. golang.org/x/tools/go/analysis

    View Slide

  7. golang.org/x/tools/go/analysis
    ‣ ೥຤͝Ζʹ࠶ߏ੒͞Εͨ੩తղੳ༻QLH܈
    ‣ Ϟδϡʔϧߏ଄Ͱ੩తղੳϥΠϒϥϦɾ$-*πʔϧΛ࡞੒Ͱ͖Δ
    ‣ ଞͷ੩తղੳϞδϡʔϧͷղੳ݁ՌΛར༻Ͱ͖Δ
    ‣ ࣗ෼ͰϞδϡʔϧΛ૊Έ߹ΘͤͨΓ৽ن௥Ճͯ͠ΦϦδφϧͷ੩
    తղੳπʔϧΛ࡞੒͢Δ͜ͱ͕Ͱ͖Δ

    View Slide

  8. golang.org/x/tools/go/analysis
    ‣ HPWFU΋͜ͷ࢓૊ΈͰ

    ϞδϡʔϧԽ͞Εͨ

    ͸ੲͷ··ʣ

    View Slide

  9. analysis.Analyzer
    ‣ ֤੩తղੳϞδϡʔϧʹ

    Ұ࣮ͭ૷͞Ε͍ͯΔ
    ‣ ґଘϞδϡʔϧ΍

    ղੳϩδοΫɾग़ྗ݁Ռ͕

    ఆٛɾ࣮૷͞ΕΔ

    View Slide

  10. analysis.Pass
    ‣ "OBMZ[FS3VOϝιουͷҾ਺
    ‣ ੩తղੳ༻ͷ৘ใΛؚΉ
    ‣ 3FQPSUGϝιουΛ࢖͏ͱ

    ղੳΤϥʔΛग़ྗͰ͖Δ

    View Slide

  11. Analyzerが扱うデータ定義
    ‣ %JBHOPTUJD
    ‣ ؆୯ʹ͍͏ͱ$-*πʔϧͰग़ྗ͞ΕΔ৘ใ
    ‣ lHJUIVCDPNKPIOEVFQLHCBSHPTPNFBOBMZTJTFSSPSz
    ‣ 'BDU
    ‣ "OBMZ[FSͰղੳதʹѻ͏தؒσʔλɻ֤"OBMZ[FS಺Ͱ࢖͏
    ‣ 3FTVMU
    ‣ ผͷ"OBMZ[FSͱղੳ݁ՌΛड͚౉͢͠Δͱ͖ʹ࢖͏

    View Slide

  12. 実際に作ってみる

    View Slide

  13. デモプロジェクト
    ‣ IUUQTHJUIVCDPNCVEPVHVNJJNQPSUDIFDL
    ‣ ΫϦʔϯΞʔΩςΫνϟܯ࡯ʢະ׬੒ʣ
    ‣ MBZFSFEBSDIJUFDUVSFతʹڐͨ͘͠ͳ͍௚઀JNQPSUΛΤϥʔʹ
    ‣ ྫɿ8FC૚ IBOEMFSQLH
    Ͱ4UPSBHF૚ SFQPTJUPSZQLH
    Λ௚઀JNQPSU
    ͍ͯͨ͠ΒΤϥʔʹ͍ͨ͠

    View Slide

  14. 最初に
    ‣ جຊతͳίʔυߏ੒͸!UFOOUFOO͞Μͷ$-*Λ࢖͏ͱࣗಈੜ੒Ͱ͖Δ
    ‣ HPHFUHJUIVCDPNUFOOUFOOHPTBTLFMFUPO
    ‣ TLFMFUPOQLHOBNF

    View Slide

  15. Analyzerの実装1
    ‣ ୯७ͳ΋ͷͳΒ"45Λ୧ͬͯ1BTTͷ3FQPSUGϝιουͰग़ྗ͢Δ͚ͩ
    ‣ ଞͷ"OBMZ[FSͷ݁ՌΛར༻͢Δ৔߹͸"OBMZ[FS3FRVJSFTʹࢦఆ͢Δ
    ‣ ϓϥάΠϯతͳϥΠϒϥϦΛ࡞Δ৔߹͸3FTVMUͱͯ͠"OBMZ[FSͷ3VO
    ϝιουͷ໭Γ஋ʹ͢Δ
    ‣ ύοέʔδؒͰղੳ৘ใΛڞ༗͍ͨ͠৔߹͸'BDUTΛ࢖͏
    ‣ "OBMZ[FSͷ3VOϝιου͸ύοέʔδ͝ͱʹ࣮ߦ͞ΕΔ

    View Slide

  16. View Slide

  17. Analyzerの実装2
    ‣ 999DIFDLFS.BJOؔ਺Ͱ"OBMZ[FSΛݺͿNBJOؔ਺Λॻ͘
    ‣ ࠓճ͸୯७ͳ"OBMZ[FSͳͷͰTJNQMFDIFDLFS

    View Slide

  18. 実行結果
    ͜Ε͚ͩͰΑ͠ͳʹ݁ՌΛग़ྗͯ͘͠ΕΔ
    (01"5)ͷઃఆ͸αϯϓϧίʔυΛղੳ͢ΔͨΊͷ͓·͡ͳ͍

    View Slide

  19. テストを作成する
    ‣ BOBMZTJTUFTUQLHΛ࢖͏ͱ௚ײతʹςετΛ࡞੒͢Δ͜ͱ͕Ͱ͖Δ
    ‣ IUUQTHPEPDPSHHPMBOHPSHYUPPMTHPBOBMZTJTBOBMZTJTUFTU
    ‣ ݕূ༻ίʔυʹظ଴݁ՌΛίϝϯτ͓͚ͯͩ͘͠Ͱྑ͍ɻ

    View Slide

  20. テストコード
    ςετίʔυࣗମ͸͜Ε͚ͩ

    View Slide

  21. 検証用コード
    UFTUEBUBTSDσ
    ΟϨΫτϦҎԼʹೖΕ͓ͯ͘ʢUFTUத͸(01")UFTUEBUBʹͳ͍ͬͯΔʣ
    XBOUʜͱظ଴݁ՌΛίϝϯτͰॻ͍͓͚ͯͩ͘ɻ

    View Slide

  22. 実行結果

    View Slide

  23. Analyzerの実装について
    ‣ ͋·ΓHPBTUʹৄ͘͠ͳ͍ͷͰ࣮૷͸ྗٕͰ৐Γ੾ͬͨ
    ‣ HPMBOHPSHYUPPMTHPBOBMZTJTQBTTFTJOTQFDUͱ͍͏ศརϔϧύʔ΋͋Δ
    ‣ ςετέʔεͷ४උ͕؆୯ͳͷͰɺ5%%ͰڍಈΛ֬ೝ͠ͳ͕Β࣮૷Ͱ͖Δ
    ‣ HPEPDͰΞλϦΛ͚ͭͳ͕Βͻͨ͢ΒHPUFTU܁Γฦ͍ͯͨ͠
    ‣ HPEPDͷଞʹ͸!UFOOUFOO͞Μͷهࣄ΍!NPUFNFO͞ΜͷղઆαΠτΛݟΔ
    ‣ (Pʹ͓͚Δ੩తղੳͷϞδϡʔϧԽʹ͍ͭͯ.FSDBSJ&OHJOFFSJOH#MPH
    ‣ (PͷͨΊͷ(PIUUQTNPUFNFOHJUIVCJP

    View Slide

  24. 今日のゴール
    ‣ HPMBOHPSHYUPPMTHPBOBMZTJTQLHͷ֓ཁΛ஌Δ
    ‣ (Pͷ੩తղੳίϚϯυͷ࣮૷ͷ࢓ํΛ஌Δ

    View Slide

  25. まとめ
    ‣ ؆୯ʹ੩తղੳίϚϯυɾϞδϡʔϧΛ࡞੒Ͱ͖ΔΑ͏ʹͳͬͨ
    ‣ ςετ΋௚ײతʹ࡞੒͢Δ͜ͱ͕Ͱ͖Δ
    ‣ "45͸׳ΕΕ͹ͳΜͱ͔ͳΔ
    ‣ ۦ͚଍ͩͬͨͷͰৄࡉ͸ϒϩάͰ

    View Slide