ข้ามไปที่เนื้อหา
cd /languages
  • แกนกลางของระบบ
  • การเขียนโปรแกรม
  • รองรับ AST และสัญลักษณ์

C บน Maguyva: กราฟการเรียกสำหรับโค้ดระบบและโค้ดฝังตัว

Maguyva รองรับ C ด้วย AST สัญลักษณ์ และกราฟ เพื่อให้เอเจนต์ AI ติดตามฟังก์ชัน struct การ include และผู้เรียกในโค้ดระบบ เฟิร์มแวร์ และไลบรารี

ทำไม C ต้องใช้กราฟการเรียก ไม่ใช่ grep

C ไม่มีคลาสหรือโมดูลสำหรับจัดระเบียบโค้ด โครงสร้างอยู่ในการเรียกฟังก์ชัน เฮดเดอร์ และ struct และชื่อเดียวกันอาจปรากฏในคอมเมนต์ มาโคร และสตริงลิเทอรัล มาโคร export และแอนโนเทชันห่อการประกาศไว้ ซึ่งทำให้เครื่องมือที่แยกวิเคราะห์ได้แค่ C ล้วนสะดุด สำหรับเอเจนต์ ขั้นแรกที่ปลอดภัยคือกราฟการเรียก

Maguyva สร้างกราฟนี้ เพื่อให้เอเจนต์เห็นว่าฟังก์ชันไปถึงที่ใด และอะไรไปถึงฟังก์ชันนั้น ก่อนเสนอการเปลี่ยนแปลง

Maguyva ดึงอะไรจาก C ได้บ้าง

Maguyva ครอบคลุม .c และ .h นิยามฟังก์ชันถูกดึงออกมาเป็นสัญลักษณ์ และเลือก struct และ union เป็นนิยามชนิดข้อมูลในการค้นหาเชิงโครงสร้างได้ ไดเรกทีฟ #include กลายเป็นความสัมพันธ์การนำเข้า

มาโคร export และการมองเห็น (รูปแบบอย่าง FOO_API, DLLEXPORT หรือ LIBEXPORT) และมาโครแอนโนเทชันด้านความปลอดภัยของเธรด (เช่น GUARDED_BY และ REQUIRES) ถูกปิดบังก่อนแยกวิเคราะห์ การประกาศที่ถูกห่อไว้จึงแยกวิเคราะห์เป็นการประกาศปกติ ตัวมาโครแบบฟังก์ชันจะถูกแยกวิเคราะห์ ส่วนตัวมาโครแบบออบเจกต์จะไม่ถูกแยกวิเคราะห์

กราฟบันทึกการเรียก การ include การสร้างอินสแตนซ์ผ่านคอมพาวด์ลิเทอรัล การอ้างอิงชนิดข้อมูล การอ่านและการเขียน และโฟลว์การควบคุม การเรียกไลบรารีมาตรฐานของ C ราว 124 รายการ (printf, malloc, free, memcpy, strlen และอื่น ๆ ทำนองเดียวกัน) ถูกกรองออกจากความสัมพันธ์ เพื่อให้โค้ดของโปรเจกต์โดดเด่นขึ้นมา

ตัวอย่างพรอมต์สำหรับเอเจนต์

  • “ใครเรียก uart_write ทั้งโดยตรงและผ่านฟังก์ชันอื่น” (dependency_search ทิศทางขาเข้า)
  • “ไฟล์ใด include config.h และใช้ struct ใดจากไฟล์นั้น” (dependency_search แล้วตามด้วย find_symbol)
  • “อธิบายว่าแพ็กเก็ตเดินทางจากอินเทอร์รัปต์การรับข้อมูลไปยังตัวแยกวิเคราะห์โปรโตคอลอย่างไร” (get_task_context)

ข้อจำกัดที่ทราบ

  • C ไม่มีคลาสและไม่มีเอกซ์เซปชัน ความสัมพันธ์การสืบทอด การอิมพลีเมนต์อินเทอร์เฟซ การ override การ throw และการ catch จึงถูกทำเครื่องหมายว่าไม่เกี่ยวข้อง
  • .h อยู่ในรายการนามสกุลไฟล์ของ C, C++ และ Objective-C เฮดเดอร์ในโครงสร้างไฟล์ที่มีหลายภาษาจึงถูกแบ่งกันระหว่างโปรไฟล์เหล่านี้
  • การเรียกฟังก์ชันไลบรารีมาตรฐานที่ถูกกรองไม่เป็นเส้นเชื่อมในกราฟ ใช้ text_pattern_search เมื่อต้องการทุก malloc หรือ memcpy

ขั้นตอนถัดไป

เชื่อมต่อรีโพซิทอรีด้วยคู่มือเริ่มต้นใช้งาน แล้วดูตารางการรองรับได้ที่หน้าความเข้ากันได้ สำหรับโค้ด C++ ในโครงสร้างเดียวกัน ให้อ่านคู่มือภาษา C++

เหมาะที่สุดสำหรับ

  • > ทีมเฟิร์มแวร์ ระบบฝังตัว และระบบปฏิบัติการ ซึ่งการเปลี่ยนเล็กน้อยในฟังก์ชันที่ใช้ร่วมกันอาจส่งผลถึงเส้นทางฮาร์ดแวร์
  • > ไลบรารี C ที่ใช้งานมายาวนาน ซึ่งมีเฮดเดอร์สาธารณะ มาโคร export และทรานสเลชันยูนิตภายในจำนวนมาก
  • > การรีวิวที่มีเอเจนต์ช่วย ซึ่งคำถามคือ “ใครเรียกสิ่งนี้ และผ่านเฮดเดอร์ใด”

เวิร์กโฟลว์ของเอเจนต์

  • > หาผู้เรียกทุกรายของฟังก์ชัน ก่อนเปลี่ยนซิกเนเจอร์หรือการจัดการข้อผิดพลาด
  • > ทำแผนที่ไฟล์ที่ include เฮดเดอร์หนึ่งและ struct ที่ไฟล์เหล่านั้นใช้
  • > ติดตามคำขอจากตัวจัดการอินเทอร์รัปต์ หรือจุดเริ่มต้น ผ่านฟังก์ชันที่คำขอไปถึง

รายละเอียดเอนจิน

  • > การรองรับ C ครอบคลุม `.c` และ `.h` นิยามฟังก์ชันเป็นสัญลักษณ์ struct และ union เป็นนิยามชนิดข้อมูล และ `#include` กลายเป็นความสัมพันธ์การนำเข้า
  • > มาโคร export, การมองเห็น และแอนโนเทชันด้านความปลอดภัยของเธรดถูกปิดบังก่อนแยกวิเคราะห์ การประกาศที่ถูกห่อจึงแยกวิเคราะห์ได้ ตัวมาโครแบบฟังก์ชันถูกแยกวิเคราะห์ ส่วนแบบออบเจกต์ไม่ถูกแยกวิเคราะห์
  • > การเรียกไลบรารีมาตรฐานราว 124 รายการ เช่น `printf`, `malloc` และ `memcpy` ถูกกรองออก ความสัมพันธ์การสืบทอด การ override และเอกซ์เซปชันถูกทำเครื่องหมายว่าไม่เกี่ยวข้อง

จุดเริ่มต้น MCP ที่มีประโยชน์

  • find_symbol

    ใช้กับชื่อฟังก์ชันหรือ struct เมื่อต้องการนิยามและทุกการอ้างอิง

  • dependency_search

    ใช้การท่องกราฟทิศทางขาเข้าบนฟังก์ชันที่ใช้ร่วมกัน ก่อนเปลี่ยนซิกเนเจอร์หรือการจัดการข้อผิดพลาด

  • get_task_context

    ใช้กับพรอมต์อย่าง “อธิบายว่าแพ็กเก็ตเดินทางจากอินเทอร์รัปต์การรับข้อมูลไปยังตัวแยกวิเคราะห์โปรโตคอลอย่างไร”

คู่มือที่เกี่ยวข้อง

ส่วนอื่นของรีโพที่เกี่ยวข้อง

ดูคู่มือทั้งหมด
เนทีฟโค้ดในระดับใหญ่ การเขียนโปรแกรม

C++ บน Maguyva: กราฟคลาสและการเรียกสำหรับโค้ดเบสขนาดใหญ่

C++ ซ่อนเป้าหมายจริงของการเรียกไว้หลัง namespace, โอเวอร์โหลด และการดิสแพตช์แบบเสมือน กราฟช่วยให้เอเจนต์หาเจอ

รองรับ AST และสัญลักษณ์ การแยกวิเคราะห์ AST การสกัดสัญลักษณ์ ความสัมพันธ์ในกราฟ

นามสกุลไฟล์

.c, .c++, .cc, .cpp, +อีก 6

เปิดคู่มือ
ปลอดภัยมาก่อน การเขียนโปรแกรม

การรองรับ Rust ใน Maguyva: บริบทที่ปลอดภัยสำหรับการเปลี่ยนแปลงด้วยความช่วยเหลือของ AI

เกี่ยวข้องเมื่อคุณต้องการความช่วยเหลือจาก AI ใน Rust โดยไม่สูญเสียการ์ดเรลเชิงโครงสร้างที่ทำให้ Rust คุ้มค่าที่จะใช้

รองรับ AST และสัญลักษณ์ การแยกวิเคราะห์ AST การสกัดสัญลักษณ์ ความสัมพันธ์ในกราฟ

นามสกุลไฟล์

.rs

เปิดคู่มือ