Engineering

Rust 1.99 lets you write C variadic functions

Rust 1.99.0, released 1 October, stabilizes defining C variadic functions and a few raw-pointer layout helpers.

Choi Hyun-im

Rust 1.99.0 came out on 1 October 2026. If you already use rustup, rustup update stable is the whole install. The release is a normal stable bump, and the part worth knowing about is what it finally lets you define, not just call.

Rust could already call C functions that take a variable argument list, such as printf. 1.99 stabilizes writing those functions yourself, with the "C" and "C-unwind" ABIs. The argument list is a VaList, which matches C’s va_list on each target, and the types you are allowed to pull out of it are limited by the VaArgSafe trait. The same release also stabilizes naked variadic functions for non-C ABIs, which have to be written with inline assembly.

That is a narrow feature, and it is unsafe for a reason. The caller has to pass what the function expects. The compiler cannot check a C variadic call the way it checks a normal Rust function. The win is for bindings and for the odd API that really is variadic: you can keep the implementation in Rust instead of dropping into a separate C file.

Two other stabilizations sit next to that. Layout::for_value_raw, mem::size_of_val_raw, and mem::align_of_val_raw settle how you ask a raw pointer for size and alignment, including pointers to unsized types. And the docs for Box::leak now say not to allocate, leak, and then free that memory later. That pattern clashes with optimizations the compiler already does and with custom allocators that are on the way. Box::into_non_null or Box::into_raw is the supported route. The same warning applies to the other leak helpers in the standard library.

None of this changes Rust syntax for everyday code. Update the toolchain, read the release notes if you maintain FFI, and leave the leak-and-free trick out of new code.