Rust 1.99.0 ประกาศเมื่อ 1 ตุลาคม 2026 และสิ่งที่เปลี่ยนมากที่สุดคือการทำให้การ นิยามฟังก์ชัน C-variadic ใน Rust เสถียร หมายถึงเขียนฟังก์ชันที่รับอาร์กิวเมนต์จำนวนไม่คงที่แบบ ... ด้วย ABI "C" หรือ "C-unwind" ได้แล้ว ก่อนหน้านี้ Rust ทำได้เพียงเรียกฟังก์ชันลักษณะนี้จาก C ทีมที่ต้องเชื่อม Rust กับไลบรารี C จึงมีทางเลือกเพิ่ม แต่รุ่นนี้ยังมีรายการเปลี่ยนด้านความเข้ากันได้ที่ควรตรวจใน CI ก่อนอัปเกรด ประกาศต้นทาง
ประกาศจริงมีอะไรบ้าง
ตามประกาศของทีม Rust ชนิด ... คือ VaList ซึ่งเข้ากันได้กับ va_list ของ C ในระดับ ABI และ trait VaArgSafe เป็นตัวกำหนดว่าชนิดใดอ่านออกจาก VaList ได้ นอกจากนี้ ฟังก์ชัน naked ที่เป็น variadic ก็เสถียรแล้ว โดยต้องเขียนด้วย inline assembly ประกาศต้นทาง
แผนภาพนี้เป็นภาพอธิบายลำดับแนวคิด ไม่ใช่ผล benchmark และไม่ได้แสดงรายละเอียดทุกกรณีของ ABI
รุ่นนี้ยังทำให้ API สำหรับงานหน่วยความจำระดับต่ำเสถียรด้วย เช่น Layout::for_value_raw, mem::size_of_val_raw และ mem::align_of_val_raw สำหรับอ่านขนาดและ alignment จาก raw pointer รวมถึง Box::into_non_null, Vec::into_parts และ std::fs::set_times ตามรายการ release notes ส่วนเอกสารของ Box::leak ถูกปรับให้แนะนำว่าอย่านำหน่วยความจำที่ leak แล้วกลับมาคืน (dealloc) ประกาศระบุว่าไม่มีการเปลี่ยนความหมายของภาษา
ผลกระทบต่อทีม
ทีมที่ไม่ได้เขียน FFI อาจไม่ได้ใช้ C-variadic โดยตรง แต่ยังควรอ่านส่วน Compatibility Notes เพราะบางรายการมีผลกับโค้ดทั่วไป ตาม release notes รายการที่ควรค้นในโค้ดของคุณมีดังนี้
| รายการ | สิ่งที่เปลี่ยน | ควรเช็ก |
|---|---|---|
| โมดูลชนิดจำนวนเต็มแบบเก่า | ประกาศ deprecated เต็มรูปแบบ | ค้น std::i32::MAX และเปลี่ยนเป็น i32::MAX |
no_mangle_generic_items | เป็น hard error | ค้น #[no_mangle] ที่อยู่บน generic item |
Macro ที่ขยายเป็นเครื่องหมาย ; ท้ายนิพจน์ | เตือนแม้ macro มาจาก crate อื่น | แจ้ง crate เจ้าของ macro แทนการปิดคำเตือนในโค้ดเรา |
RangeInclusive ที่วนครบแล้ว | start()/end() หรือการใช้เป็น slice index อาจให้ค่าต่างจากเดิม | ตรวจโค้ดที่อ่านค่ากลับจาก range หลังวนจบ |
Pin::new_unchecked | เงื่อนไขความปลอดภัยเปลี่ยนเล็กน้อย | ทบทวนบล็อก unsafe ที่ใช้ |
ฝั่ง Cargo มีสามเรื่อง: profile debug ใหม่ที่ตอนนี้เหมือน dev ทุกประการ, การตั้ง default-features = false ทับ dependency ที่สืบจาก workspace สำหรับสมาชิกที่ใช้ edition 2024 ขึ้นไป (edition เก่ากว่าจะถูกเมินพร้อมคำเตือน) และการปิด incremental compilation เป็นค่าเริ่มต้นเมื่อตรวจพบตัวแปร CI ทีมที่พึ่งแคช incremental ใน pipeline ควรดูเวลา build หลังอัปเกรด release notes
สิ่งที่ควรทำ
- อัปเดตด้วย
rustup update stableแล้ว build และรันcargo clippyบน branch ทดลองก่อน ตามวิธีที่ ประกาศต้นทาง แนะนำสำหรับการอัปเดต - ค้นรายการในตารางด้านบน โดยเฉพาะ
std::i32::MAXและ#[no_mangle]บน generic item เพราะรายการหลังจะทำให้ build ไม่ผ่าน - ทีมที่เชื่อมกับ C: ประเมินว่าจะย้าย shim ที่เคยต้องเขียนด้วย C มาเป็น Rust หรือไม่ แต่ควรเริ่มจากฟังก์ชันเล็กและมีเทสต์ที่เรียกจาก C จริง
ข้อจำกัดและสิ่งที่ยังไม่ทราบ
ประกาศไม่ได้สรุปรายละเอียดความปลอดภัยของการอ่านอาร์กิวเมนต์จาก VaList ทั้งหมด จึงควรอ่านเอกสารของ VaList และ VaArgSafe ก่อนใช้งาน ข่าวนี้สรุปจากหน้าประกาศและ release notes เท่านั้น ไม่ได้ทดสอบ build กับโค้ดจริง และรายการ Cargo/Clippy ฉบับเต็มอยู่ในหน้า changelog ของต้นทาง ซึ่งไม่ได้นำมาสรุปครบ ณ ที่นี้ รุ่นนี้ยังอัปเดตไปใช้ LLVM 23 และเลื่อน riscv64-unknown-linux-musl เป็น Tier 2 พร้อม host tools ตาม release notes
แหล่งข้อมูลต้นทาง: blog.rust-lang.org › Rust-1.99.0 และ doc.rust-lang.org › releases.html
