เฟสที่ 2: การตรวจสอบ
นี่คือเอกสารที่อธิบายวิธีตรวจสอบสคริปต์ .mm
SymbolTable
ระหว่างการตรวจสอบ ขั้นแรก SymbolTable จะถูกสร้างขึ้นจาก AST
มีแหล่งข้อมูลออนไลน์ที่ดีมากมายที่สอนเรื่องตารางสัญลักษณ์ หากจะเป็นประโยชน์กับผู้อ่าน
ในระดับสูง SymbolTable เก็บเมตาดาต้าเกี่ยวกับสัญลักษณ์ของซอร์สโค้ด
สำหรับสคริปต์ .mm สัญลักษณ์อาจเป็นส่วนของกฎการแมตช์ของโพรบ (เช่น provider, package, event และ mode) ชื่อฟังก์ชัน และตัวแปร (โลคัลหรือโกลบอล)
enum ชื่อ Record ในไฟล์ verifier/types.rs นิยามสัญลักษณ์เหล่านี้และเมตาดาต้าที่สนใจของแต่ละตัว
เมตาดาต้าที่สนใจมักเป็นข้อมูลชนิดและการระบุที่อยู่ ซึ่งสอดคล้องกับ ID ที่กำหนดให้สัญลักษณ์หลังถูกปล่อยเข้าไปในโปรแกรม Wasm
ข้อมูลชนิดถูกใช้ทั้งตอนตรวจชนิดสคริปต์และตอนปล่อย instrumentation (เพื่อให้รู้ชนิดของแต่ละรายการที่ปล่อยออกมา)
ตัวอย่างหนึ่งของการใช้เมตาดาต้าการระบุที่อยู่ คือการปล่อยและการเรียกฟังก์ชัน
หลังจากฟังก์ชันที่นิยามโดย instrumentation ถูกฉีดเข้าไปแล้ว ID ของฟังก์ชันนี้ต้องถูกเก็บไว้ใน SymbolTable เพื่อค้นหาและนำไปใช้เมื่อมีการปล่อยการเรียกฟังก์ชันในอนาคต (ดูเอกสาร InitGenerator)
สัญลักษณ์เหล่านี้อยู่ภายในสโคปบางอย่าง
ชนิดของสโคปที่ปรากฏในสคริปต์ .mm หาได้ใน enum ชื่อ ScopeType ในไฟล์ verifier/types.rs
แนวคิดเรื่องสโคปในบริบทนี้เหมือนกับภาษาโปรแกรมอื่นๆ
สโคปนิยามว่าตัวแปรและฟังก์ชันเข้าถึงได้ที่ไหนตามตำแหน่งในโปรแกรม
ในบริบทของ Whamm มีสโคปบางอย่างที่ดำรงอยู่แต่ผู้ใช้ปลายทางเข้าถึงไม่ได้
ลองพิจารณากฎการแมตช์ของโพรบ: provider:package:event:mode
แต่ละส่วนของกฎการแมตช์นี้มีสโคปของตัวเองจริงๆ
สิ่งนี้ทำให้แต่ละส่วนแนะนำตัวแปรและฟังก์ชันที่ผูกไว้ซึ่งเป็นประโยชน์ของตัวเอง เพื่อให้ผู้ใช้เขียน instrumentation ที่แสดงออกได้หลากหลายขึ้น!
ตัวแปรและฟังก์ชันที่ผูกไว้เหล่านี้ถูกเพิ่มเข้า AST ในไฟล์ whamm_parser.rs โดยเรียกฟังก์ชัน get_matches ของ provider_handler.rs
ดูเอกสารไวยากรณ์โพรบสำหรับเครื่องมือ CLI ที่เป็นประโยชน์ ซึ่งช่วยให้ผู้ใช้เห็นว่าอะไรอยู่ในสโคปของกฎการแมตช์ของโพรบใดๆ
ดูเอกสารการขยาย providerสำหรับวิธีขยาย provider และฟังก์ชัน/ตัวแปรที่ผูกไว้
ปัญหา / ทางแก้ชั่วคราว
1. ความเป็นเจ้าของของ Record และ Scope
ตอนเขียนโครงสร้าง SymbolTable มีปัญหาเกี่ยวกับการผลักความเป็นเจ้าของของ Record และ Scope ลงไปในแต่ละพาเรนต์
ทางแก้ชั่วคราวคือถือ Vec ของ Record และ Scope ทั้งหมด ของทั้งโปรแกรมไว้ใน struct SymbolTable แล้วถือชนิด usize ที่ชี้เข้าไปใน Vec เหล่านี้ใน Record และ Scope
เป็นไปได้ว่าปัญหานี้เลี่ยงได้ด้วยการ box ค่าใน Record และ Scope แต่ต้องทดลองเพิ่มเติม
การสร้าง SymbolTable
ไฟล์ builder_visitor.rs สร้าง SymbolTable จาก AST ของสคริปต์
ฟังก์ชัน visit_whamm เป็นจุดเข้าของพฤติกรรมนี้
ซึ่งทำตามดีไซน์แพตเทิร์น visitor
มีแหล่งข้อมูลออนไลน์ที่ดีมากมายที่สอนเรื่อง visitor pattern หากจะเป็นประโยชน์กับผู้อ่าน
TypeChecker
จากนั้นตัวตรวจชนิดจะท่อง AST และใช้ SymbolTable เพื่อตรวจสอบว่าการใช้ตัวแปรเหมาะสมหรือไม่
มันค้นหาได้ทั้งการใช้งานนอกสโคป การเรียกเมธอดที่ไม่ถูกต้อง การใช้ชนิดผิด ฯลฯ