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/
x/tools/go/analysisで静的解析ツールを自作する(P 6O$POGFSFODF (P͋Μ͜-5େձLH:PJDIJSP4IJNJ[V!CVEPVHVNJ
View Slide
自己紹介‣ ਗ਼ਫཅҰ!CVEPVHVNJ‣ ‣ #BDLFOE%FTLUPQ"QQFOHJOFFS‣ (P3VCZPO3BJMT/&5‣ ϒϩάIUUQCVEPVHVNJHJUIVCJP‣ ίϛϡχςΟ׆ಈ(P$POGFSFODFHPMBOHUPLZP
今日のゴール‣ HPMBOHPSHYUPPMTHPBOBMZTJTQLHͷ֓ཁΛΔ‣ (Pͷ੩తղੳίϚϯυͷ࣮ͷํΛΔ
アジェンダ‣ HPMBOHPSHYUPPMTHPBOBMZTJTύοέʔδͷओཁͳ֓೦ΛΔ‣ "OBMZ[FS1BTT‣ %JBHOPTUJD'BDU3FTVMU‣ (Pͷ੩తղੳίϚϯυͷ࣮ͷྲྀΕΛ͏
最初に‣ HPWFUHPJNQPSUTFSSDIFDLͳͲɺ(P੩తղੳπʔϧ͕๛‣ ࣾίʔσΟϯάϧʔϧ९कΛ֬ೝ͢Δ੩తղੳπʔϧΛ࡞Γ͍ͨ
golang.org/x/tools/go/analysis
golang.org/x/tools/go/analysis‣ ͝Ζʹ࠶ߏ͞Εͨ੩తղੳ༻QLH܈‣ ϞδϡʔϧߏͰ੩తղੳϥΠϒϥϦɾ$-*πʔϧΛ࡞Ͱ͖Δ‣ ଞͷ੩తղੳϞδϡʔϧͷղੳ݁ՌΛར༻Ͱ͖Δ‣ ࣗͰϞδϡʔϧΛΈ߹ΘͤͨΓ৽نՃͯ͠ΦϦδφϧͷ੩తղੳπʔϧΛ࡞͢Δ͜ͱ͕Ͱ͖Δ
golang.org/x/tools/go/analysis‣ HPWFU͜ͷΈͰ ϞδϡʔϧԽ͞Εͨ ੲͷ··ʣ
analysis.Analyzer‣ ֤੩తղੳϞδϡʔϧʹ Ұ࣮ͭ͞Ε͍ͯΔ‣ ґଘϞδϡʔϧ ղੳϩδοΫɾग़ྗ݁Ռ͕ ఆٛɾ࣮͞ΕΔ
analysis.Pass‣ "OBMZ[FS3VOϝιουͷҾ‣ ੩తղੳ༻ͷใΛؚΉ‣ 3FQPSUGϝιουΛ͏ͱ ղੳΤϥʔΛग़ྗͰ͖Δ
Analyzerが扱うデータ定義‣ %JBHOPTUJD‣ ؆୯ʹ͍͏ͱ$-*πʔϧͰग़ྗ͞ΕΔใ‣ lHJUIVCDPNKPIOEVFQLHCBSHPTPNFBOBMZTJTFSSPSz‣ 'BDU‣ "OBMZ[FSͰղੳதʹѻ͏தؒσʔλɻ֤"OBMZ[FSͰ͏‣ 3FTVMU‣ ผͷ"OBMZ[FSͱղੳ݁ՌΛड͚͢͠Δͱ͖ʹ͏
実際に作ってみる
デモプロジェクト‣ IUUQTHJUIVCDPNCVEPVHVNJJNQPSUDIFDL‣ ΫϦʔϯΞʔΩςΫνϟܯʢະʣ‣ MBZFSFEBSDIJUFDUVSFతʹڐͨ͘͠ͳ͍JNQPSUΛΤϥʔʹ‣ ྫɿ8FC IBOEMFSQLHͰ4UPSBHF SFQPTJUPSZQLHΛJNQPSU͍ͯͨ͠ΒΤϥʔʹ͍ͨ͠
最初に‣ جຊతͳίʔυߏ!UFOOUFOO͞Μͷ$-*Λ͏ͱࣗಈੜͰ͖Δ‣ HPHFUHJUIVCDPNUFOOUFOOHPTBTLFMFUPO‣ TLFMFUPOQLHOBNF
Analyzerの実装1‣ ୯७ͳͷͳΒ"45Λ୧ͬͯ1BTTͷ3FQPSUGϝιουͰग़ྗ͢Δ͚ͩ‣ ଞͷ"OBMZ[FSͷ݁ՌΛར༻͢Δ߹"OBMZ[FS3FRVJSFTʹࢦఆ͢Δ‣ ϓϥάΠϯతͳϥΠϒϥϦΛ࡞Δ߹3FTVMUͱͯ͠"OBMZ[FSͷ3VOϝιουͷΓʹ͢Δ‣ ύοέʔδؒͰղੳใΛڞ༗͍ͨ͠߹'BDUTΛ͏‣ "OBMZ[FSͷ3VOϝιουύοέʔδ͝ͱʹ࣮ߦ͞ΕΔ
Analyzerの実装2‣ 999DIFDLFS.BJOؔͰ"OBMZ[FSΛݺͿNBJOؔΛॻ͘‣ ࠓճ୯७ͳ"OBMZ[FSͳͷͰTJNQMFDIFDLFS
実行結果͜Ε͚ͩͰΑ͠ͳʹ݁ՌΛग़ྗͯ͘͠ΕΔ(01"5)ͷઃఆαϯϓϧίʔυΛղੳ͢ΔͨΊͷ͓·͡ͳ͍
テストを作成する‣ BOBMZTJTUFTUQLHΛ͏ͱײతʹςετΛ࡞͢Δ͜ͱ͕Ͱ͖Δ‣ IUUQTHPEPDPSHHPMBOHPSHYUPPMTHPBOBMZTJTBOBMZTJTUFTU‣ ݕূ༻ίʔυʹظ݁ՌΛίϝϯτ͓͚ͯͩ͘͠Ͱྑ͍ɻ
テストコードςετίʔυࣗମ͜Ε͚ͩ
検証用コードUFTUEBUBTSDσΟϨΫτϦҎԼʹೖΕ͓ͯ͘ʢUFTUத(01")UFTUEBUBʹͳ͍ͬͯΔʣXBOUʜͱظ݁ՌΛίϝϯτͰॻ͍͓͚ͯͩ͘ɻ
実行結果
Analyzerの実装について‣ ͋·ΓHPBTUʹৄ͘͠ͳ͍ͷͰ࣮ྗٕͰΓͬͨ‣ HPMBOHPSHYUPPMTHPBOBMZTJTQBTTFTJOTQFDUͱ͍͏ศརϔϧύʔ͋Δ‣ ςετέʔεͷ४උ͕؆୯ͳͷͰɺ5%%ͰڍಈΛ֬ೝ͠ͳ͕Β࣮Ͱ͖Δ‣ HPEPDͰΞλϦΛ͚ͭͳ͕Βͻͨ͢ΒHPUFTU܁Γฦ͍ͯͨ͠‣ HPEPDͷଞʹ!UFOOUFOO͞Μͷهࣄ!NPUFNFO͞ΜͷղઆαΠτΛݟΔ‣ (Pʹ͓͚Δ੩తղੳͷϞδϡʔϧԽʹ͍ͭͯ.FSDBSJ&OHJOFFSJOH#MPH‣ (PͷͨΊͷ(PIUUQTNPUFNFOHJUIVCJP
まとめ‣ ؆୯ʹ੩తղੳίϚϯυɾϞδϡʔϧΛ࡞Ͱ͖ΔΑ͏ʹͳͬͨ‣ ςετײతʹ࡞͢Δ͜ͱ͕Ͱ͖Δ‣ "45׳ΕΕͳΜͱ͔ͳΔ‣ ۦ͚ͩͬͨͷͰৄࡉϒϩάͰ