- Fil-C คอมไพเลอร์ C/C++ แบบใหม่ที่มี ความปลอดภัยของหน่วยความจำ แสดงให้เห็นถึง ความเข้ากันได้สูง กับโค้ดเดิม โดยไลบรารีและแอปพลิเคชันส่วนใหญ่ทำงานได้โดยไม่ต้องแก้ไข
- มีขั้นตอนสำหรับ คอมไพล์จากซอร์สและติดตั้ง Fil-C บน Debian 13 พร้อม สคริปต์ติดตั้งอัตโนมัติ สำหรับคอมไพล์ glibc และ binutils ใหม่ด้วย Fil-C
- ใน ไมโครบेंช์มาร์กซอฟต์แวร์เข้ารหัสราว 9000 รายการ Fil-C ใช้ จำนวน cycle มากกว่า clang 1~4 เท่า
- มีความพยายาม ผนวกรวมเข้ากับระบบสร้างแพ็กเกจ Debian โดยเพิ่ม ABI ใหม่ (
amd64fil0) เพื่อให้สามารถ ติดตั้งแพ็กเกจที่อิงกับ Fil-C ควบคู่กันได้
- Fil-C มุ่งเป้าไปที่ทั้ง ความปลอดภัยของหน่วยความจำและความเข้ากันได้กับระบบนิเวศเดิม พร้อมแสดงศักยภาพในการขยายสู่ระบบที่อิงกับ Debian
ภาพรวมของ Fil-C และความประทับใจแรกเริ่ม
- Fil-C เป็น คอมไพเลอร์ C/C++ ที่รับประกันความปลอดภัยของหน่วยความจำ และมี ความเข้ากันได้สูง กับโค้ดเดิม
- ไลบรารีและแอปพลิเคชันส่วนใหญ่ทำงานได้โดยไม่ต้องแก้ไข
- แม้บางกรณีจะต้องมีการแก้ไขเพิ่มเติม แต่ก็ไม่ใช่ปัญหาที่ยากจะแก้
- ผู้เขียนตั้งเป้าที่จะ ย้ายหลายระบบที่ดูแลอยู่ไปใช้โค้ดที่คอมไพล์ด้วย Fil-C เพื่อเพิ่มการป้องกัน
- สภาพแวดล้อมทดสอบคือ Debian 13, AMD Ryzen 5 7640HS (6 คอร์ 12 เธรด), RAM 12GB, สว็อป 36GB
เอกสารและสคริปต์ที่เกี่ยวข้อง
- มีการเผยแพร่ สคริปต์ diff สำหรับการตรวจสอบ เพื่อเปรียบเทียบความแตกต่างระหว่าง Fil-C กับซอร์สต้นน้ำระดับบน (เช่น clang, glibc)
- มีสคริปต์ filian-install-compiler สำหรับดาวน์โหลด คอมไพล์ และติดตั้ง Fil-C, glibc และ binutils บน Debian 13
- เวลาที่ใช้ทั้งหมด: real 86 นาที, user 477 นาที, system 52 นาที
- มีสคริปต์ filian-install-packages สำหรับสร้าง Debian source package ด้วย Fil-C
- ยืนยันแล้วว่าแพ็กเกจบางส่วน (เช่น bzip2) สร้างได้ตามปกติ
- มีการเผยแพร่ กราฟประสิทธิภาพ Fil-C vs. clang
- เป็นผลจากไมโครบेंช์มาร์กที่เกี่ยวข้องกับงานเข้ารหัสประมาณ 9000 รายการ
- โค้ดที่คอมไพล์ด้วย Fil-C ใช้ cycle มากกว่า clang 1~4 เท่า
การติดตั้งและการคอมไพล์ Fil-C
- หลังติดตั้งแพ็กเกจที่จำเป็นด้วยสิทธิ root แล้ว จะทำการคอมไพล์ด้วยผู้ใช้ที่ไม่มีสิทธิพิเศษชื่อ
filc
- ซอร์สของ Fil-C รวม glibc และไลบรารีกับแอปพลิเคชันระดับสูงอีกหลายรายการ
- คำสั่ง build:
time ./build_all_fast_glibc.sh
- สามารถเลือกใช้ musl ได้เช่นกัน แต่มี ความไม่เข้ากันได้ กับบางแพ็กเกจ (เช่น attr, elfutils, sed, vim)
- หากเกิดปัญหาหน่วยความจำไม่พอระหว่าง build แก้ได้ด้วยการขยายพื้นที่สว็อปเป็น 36GB
- ใช้สว็อปสูงสุดประมาณ 19GB และ RAM 12GB
- บนเซิร์ฟเวอร์ขนาดใหญ่ (128 คอร์, RAM 512GB) การ build Fil-C ใช้เวลา 8 นาที และ musl ใช้เวลา 6 นาที
การ build ไลบรารีและแอปพลิเคชันเพิ่มเติม
- Fil-C มี build_all_slow.sh สำหรับ build ไลบรารีและแอปพลิเคชันจำนวนมาก
- มีการเขียนสคริปต์ build-parallel-20251023.py เพื่อทำงานนี้แบบขนาน
- แม้เกิดข้อผิดพลาดก็จะไม่หยุด แต่ดำเนินการ build ทั้งหมดต่อไป
- การ build แบบขนานช่วยลดเวลาได้
- บนระบบ phoenix สำเร็จ 60 จาก 61 เป้าหมาย (real 101 นาที)
- มีเพียง libcap ที่ build ไม่สำเร็จ (เกิดข้อผิดพลาดในการโหลด
liblto_plugin.so)
- util-linux ต้องมีการแก้ไขที่เกี่ยวข้องกับ syscall
- แพ็กเกจหลักอื่น ๆ ที่เหลือ (เช่น attr, bash, curl, openssl, vim) build สำเร็จโดยไม่มีปัญหา
ไลบรารีและแอปพลิเคชันเพิ่มเติมที่ทดสอบแล้ว
- boost 1.89.0: ส่วนใหญ่ทำงานได้ตามปกติ แต่ต้องแก้ไขบางส่วนที่เกี่ยวข้องกับ vfork
- cdb-20251021: ทำงานได้ตามปกติ โดยมีความแตกต่างของข้อความผิดพลาดในการทดสอบ OOM แบบจงใจ
- libcpucycles, libgc (ใช้แทน gshim), libntruprime, lpeg, luv เป็นต้น build และทดสอบผ่าน
- ยืนยันว่าแอปพลิเคชัน CLI หลักอย่าง mutt, tig, w3m ก็ทำงานได้ตามปกติ
การผนวกรวมกับ Debian (Filian)
- ใช้โครงสร้าง multi-architecture ของ Debian เพื่อเพิ่ม ABI สำหรับ Fil-C โดยเฉพาะ (
amd64fil0)
- ตัวอย่างเช่น สามารถติดตั้งเวอร์ชันที่คอมไพล์ด้วย Fil-C ได้ด้วย
apt install bash:amd64fil0
- Fil-C ใช้ไดเรกทอรีของตัวเองแทน
/usr/include จึงเกิด ปัญหาเส้นทางไฟล์ header ไม่ตรงกัน
- สคริปต์ filian-install-compiler ปรับสิ่งนี้ให้สอดคล้องกับเส้นทางมาตรฐานของ Debian
- มีการเพิ่มการรับรู้สถาปัตยกรรม Fil-C ให้กับเครื่องมือ build ของ Debian (เช่น dpdk-buildpackage, sbuild)
- มีการแก้ไข
/usr/share/dpkg/cputable, config.sub เป็นต้น
- วาง Fil-C และ standard library ไว้ในเส้นทาง
/usr/libexec/fil/amd64
- ทำให้สามารถใช้คำสั่ง
filcc, fil++ ได้ทั่วทั้งระบบ
ตัวอย่างการ build แพ็กเกจ Debian
- มีสคริปต์ช่วยเหลือ
fillet สำหรับปรับ symbol และเส้นทางติดตั้งของ Debian source package
- ผลการ build แพ็กเกจ
tinycdb ด้วย Fil-C คือ สร้างแพ็กเกจ .deb สำหรับ amd64fil0 โดยเฉพาะ 3 รายการ
- หลังติดตั้ง สามารถตรวจสอบ symbol ของ Fil-C (
pizlonated_) และเส้นทางไลบรารีได้ด้วยคำสั่ง nm, ldd
- เมื่อรันจะยืนยันได้ว่าฟังก์ชันป้องกัน runtime ของ Fil-C ทำงานจริง (แสดงข้อความบล็อกการละเมิด “memory safety”)
การ build แพ็กเกจ Debian เพิ่มเติม
- libc-dev: สร้างแพ็กเกจจำลองเพื่อแก้ปัญหา dependency
- ncurses: build ด้วย Fil-C แล้วติดตั้งได้
- libmd: ต้องคอมไพล์ใหม่เนื่องจากเวอร์ชันไม่ตรงกันระหว่างสถาปัตยกรรม
- readline: ต้องมี symbolic link สำหรับเส้นทาง header
- lua5.4: ทำงานได้ตามปกติหลังแก้ dependency ของ readline
บทสรุป
- Fil-C เป็นความพยายามที่จะทำให้เกิดทั้ง การเสริมความปลอดภัยของหน่วยความจำและความเข้ากันได้กับระบบนิเวศ C/C++ เดิม พร้อมกัน
- ได้พิสูจน์แล้วว่ามี ความเป็นไปได้ในการ build และผนวกรวมแพ็กเกจบนสภาพแวดล้อม Debian
- แม้จะยังต้องปรับสคริปต์ build และเส้นทาง header บางส่วน แต่ก็ รองรับแพ็กเกจโอเพนซอร์สหลักส่วนใหญ่ได้แล้ว
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
คิดว่าน่าจะเป็นเพราะ ความแปรปรวนของไมโครเบนช์มาร์ก แต่บางผลลัพธ์ก็ดูเร็วเกินไปจนทำให้อยากรู้ว่ามี ปัญหาด้านความถูกต้อง หรือไม่
เพื่อการนี้จึงได้สร้างและแบ่งปัน ไลบรารี GC shim และสคริปต์สำหรับการบิลด์
พอเพิ่ม swap เป็น 36GB ก็สามารถบิลด์ได้ตามปกติ และใช้สูงสุดถึง 19GB swap + 12GB RAM
บนเซิร์ฟเวอร์ 128 คอร์, RAM 512GB ใช้เวลา 8 นาทีในการบิลด์ Fil-C และ 6 นาทีสำหรับ musl
ดูเหมือนว่า Fil-C จะทำ การวิเคราะห์แบบสถิต ค่อนข้างมาก
ตรวจสอบได้ที่ cdb.cr.yp.to และมีการกล่าวถึงว่าซับโดเมน cdb ใหม่ใช้ pqconnect
pqconnect ใช้ในขั้นตอนการเชื่อมต่อ HTTP(S) และทั้งสองอย่างต่างก็ เข้ารหัสกุญแจสาธารณะไว้ใน DNS แต่มีบทบาทต่างกัน
pqconnect ใส่ กุญแจสาธารณะไว้ใน CNAME แบบเดียวกับ CurveCP
อย่างไรก็ตาม ส่วน pq1 ไม่ใช่กุญแจสาธารณะ แต่เป็นแฮชของกุญแจสาธารณะระยะยาวของเซิร์ฟเวอร์
โน้ตเกี่ยวกับ Fil-C ถูกส่งเมื่อ 3 วันก่อน
เธรดที่เกี่ยวข้อง
ลิงก์การสนทนาก่อนหน้า
เป้าหมายน่าจะเป็นการทำให้โปรแกรม C/C++ ส่วนใหญ่สามารถรันได้อย่างปลอดภัย โดยไม่ต้องเขียนใหม่เป็น Rust
และก็สงสัยด้วยว่า Epic Games เข้ามาเกี่ยวข้องอย่างไร
แทนที่จะใช้เขียนโค้ดใหม่ น่าจะเหมาะกับการใช้ครอบโค้ดเดิมให้ปลอดภัยแบบ WASM sandboxing มากกว่า
แต่ Fil-C ก็สามารถจับ แครชได้แม่นยำกว่า
น่าจะมีจุดที่ Rust โหมด unsafe เอาไปอ้างอิงได้เช่นกัน
โดยเฉพาะวิธี ลิงก์แบบสแตติก กับดีเพนเดนซีที่คอมไพล์ด้วย Fil-C นั้นน่าสนใจ
เพราะ Fil-C ต้องควบคุมทั้งโปรแกรมเพื่อการติดตามพอยน์เตอร์ ดังนั้น FFI จึงไม่สอดคล้องกับสถาปัตยกรรมนี้
เช่น Fil-C: A memory-safe C implementation,
Safepoints and Fil-C,
Fil’s Unbelievable Garbage Collector เป็นต้น
การถกเถียงเรื่อง ความปลอดภัยของหน่วยความจำ ดำเนินต่อเนื่องตลอดช่วงปี 2024~2025
Fil-C คือ อิมพลีเมนเทชันที่ปลอดภัยด้านหน่วยความจำและเข้ากันได้กับ C/C++ โดยโค้ดส่วนใหญ่คอมไพล์ได้แทบไม่ต้องแก้ไข
ข้อผิดพลาดด้านหน่วยความจำทั้งหมดจะถูก ตรวจจับเป็น panic และรับประกันความปลอดภัยด้วย GC แบบ concurrent และ InvisiCaps
ดูคำอธิบายเพิ่มเติมได้ที่ เว็บไซต์ทางการ
อยากรู้เหตุผล และอยากลองใช้ Fil-C ด้วยตัวเอง
บทความที่เกี่ยวข้อง