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

สิ่งที่ควรทำ

  1. อัปเดตด้วย rustup update stable แล้ว build และรัน cargo clippy บน branch ทดลองก่อน ตามวิธีที่ ประกาศต้นทาง แนะนำสำหรับการอัปเดต
  2. ค้นรายการในตารางด้านบน โดยเฉพาะ std::i32::MAX และ #[no_mangle] บน generic item เพราะรายการหลังจะทำให้ build ไม่ผ่าน
  3. ทีมที่เชื่อมกับ 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