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/

Eb6be531bcfaa99714d8d3b48665a5a9?s=128

Yoichiro Shimizu

January 31, 2019
Tweet

Transcript

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

  2. 自己紹介 ‣ ਗ਼ਫཅҰ࿠!CVEPVHVNJ ‣  ‣ #BDLFOE%FTLUPQ"QQFOHJOFFS ‣ (P3VCZPO3BJMT/&5 ‣

    ϒϩάIUUQCVEPVHVNJHJUIVCJP ‣ ίϛϡχςΟ׆ಈ(P$POGFSFODFHPMBOHUPLZP
  3. 今日のゴール ‣ HPMBOHPSHYUPPMTHPBOBMZTJTQLHͷ֓ཁΛ஌Δ ‣ (Pͷ੩తղੳίϚϯυͷ࣮૷ͷ࢓ํΛ஌Δ

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

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

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

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

  8. golang.org/x/tools/go/analysis ‣ HPWFU΋͜ͷ࢓૊ΈͰ
 ϞδϡʔϧԽ͞Εͨ
 ͸ੲͷ··ʣ

  9. analysis.Analyzer ‣ ֤੩తղੳϞδϡʔϧʹ
 Ұ࣮ͭ૷͞Ε͍ͯΔ ‣ ґଘϞδϡʔϧ΍
 ղੳϩδοΫɾग़ྗ݁Ռ͕
 ఆٛɾ࣮૷͞ΕΔ

  10. analysis.Pass ‣ "OBMZ[FS3VOϝιουͷҾ਺ ‣ ੩తղੳ༻ͷ৘ใΛؚΉ ‣ 3FQPSUGϝιουΛ࢖͏ͱ
 ղੳΤϥʔΛग़ྗͰ͖Δ

  11. Analyzerが扱うデータ定義 ‣ %JBHOPTUJD ‣ ؆୯ʹ͍͏ͱ$-*πʔϧͰग़ྗ͞ΕΔ৘ใ ‣ lHJUIVCDPNKPIOEVFQLHCBSHPTPNFBOBMZTJTFSSPSz ‣ 'BDU ‣

    "OBMZ[FSͰղੳதʹѻ͏தؒσʔλɻ֤"OBMZ[FS಺Ͱ࢖͏ ‣ 3FTVMU ‣ ผͷ"OBMZ[FSͱղੳ݁ՌΛड͚౉͢͠Δͱ͖ʹ࢖͏
  12. 実際に作ってみる

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

    Ͱ4UPSBHF૚ SFQPTJUPSZQLH Λ௚઀JNQPSU ͍ͯͨ͠ΒΤϥʔʹ͍ͨ͠
  14. 最初に ‣ جຊతͳίʔυߏ੒͸!UFOOUFOO͞Μͷ$-*Λ࢖͏ͱࣗಈੜ੒Ͱ͖Δ ‣ HPHFUHJUIVCDPNUFOOUFOOHPTBTLFMFUPO ‣ TLFMFUPOQLHOBNF

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

    ‣ "OBMZ[FSͷ3VOϝιου͸ύοέʔδ͝ͱʹ࣮ߦ͞ΕΔ
  16. None
  17. Analyzerの実装2 ‣ 999DIFDLFS.BJOؔ਺Ͱ"OBMZ[FSΛݺͿNBJOؔ਺Λॻ͘ ‣ ࠓճ͸୯७ͳ"OBMZ[FSͳͷͰTJNQMFDIFDLFS

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

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

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

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

  22. 実行結果

  23. Analyzerの実装について ‣ ͋·ΓHPBTUʹৄ͘͠ͳ͍ͷͰ࣮૷͸ྗٕͰ৐Γ੾ͬͨ ‣ HPMBOHPSHYUPPMTHPBOBMZTJTQBTTFTJOTQFDUͱ͍͏ศརϔϧύʔ΋͋Δ ‣ ςετέʔεͷ४උ͕؆୯ͳͷͰɺ5%%ͰڍಈΛ֬ೝ͠ͳ͕Β࣮૷Ͱ͖Δ ‣ HPEPDͰΞλϦΛ͚ͭͳ͕Βͻͨ͢ΒHPUFTU܁Γฦ͍ͯͨ͠ ‣

    HPEPDͷଞʹ͸!UFOOUFOO͞Μͷهࣄ΍!NPUFNFO͞ΜͷղઆαΠτΛݟΔ ‣ (Pʹ͓͚Δ੩తղੳͷϞδϡʔϧԽʹ͍ͭͯ.FSDBSJ&OHJOFFSJOH#MPH ‣ (PͷͨΊͷ(PIUUQTNPUFNFOHJUIVCJP
  24. 今日のゴール ‣ HPMBOHPSHYUPPMTHPBOBMZTJTQLHͷ֓ཁΛ஌Δ ‣ (Pͷ੩తղੳίϚϯυͷ࣮૷ͷ࢓ํΛ஌Δ

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