Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 ‣ ਗ਼ਫཅҰ࿠!CVEPVHVNJ ‣  ‣ #BDLFOE%FTLUPQ"QQFOHJOFFS ‣ (P3VCZPO3BJMT/&5 ‣ ϒϩάIUUQCVEPVHVNJHJUIVCJP ‣ ίϛϡχςΟ׆ಈ(P$POGFSFODFHPMBOHUPLZP

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

golang.org/x/tools/go/analysis

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

実際に作ってみる

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

実行結果

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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