On this page · 6 sections
  1. C Variadic Functions Defined in Rust
  2. Raw-Pointer Layout APIs and the Box::leak Guidance
  3. Compatibility Notes and Cargo Changes in 1.99.0
  4. i686 Windows Loses Host Tools in Rust 1.100
  5. Miri Stored Secrets in target/ for CI Caches
  6. Sources

Rust 1.99.0, released on October 1, lets Rust code define C-ABI variadic functions, stabilizes layout queries on raw pointers and advises against freeing memory leaked with Box::leak. Two weeks later, Rust 1.99.1 fixed a miscompilation of FFI bool return values on x86_64, so 1.99.1 is the version to install with rustup update stable.

C Variadic Functions Defined in Rust #

Rust could already call external variadic functions such as libc::printf. 1.99.0 stabilizes defining them, with the "C" and "C-unwind" ABIs. The type of ... is VaList, which is ABI-compatible with C's va_list, and the VaArgSafe trait limits which types can be read from it. The release post gives this example:

Rust
/// SAFETY: must be called with (at least) 2 i32 arguments.
unsafe extern "C" fn sum(mut args: ...) -> i32 {
    // SAFETY: guaranteed by the caller.
    let a = unsafe { args.next_arg::<i32>() };
    let b = unsafe { args.next_arg::<i32>() };
    a + b
}

Naked variadic functions with non-"C" ABIs, written with inline assembly, are stabilized as well.

Raw-Pointer Layout APIs and the Box::leak Guidance #

1.99.0 settles the safety requirements for reading the size and alignment behind a raw pointer, including pointers to unsized types, and stabilizes Layout::for_value_raw, mem::size_of_val_raw and mem::align_of_val_raw. It also updates the Box::leak documentation to recommend against later deallocating leaked memory, because such code interacts badly with current and future compiler optimizations and with the coming custom allocators. Box::into_non_null or Box::into_raw should be used instead, and the same applies to the other leak functions in the standard library.

Other stabilized APIs include Vec::into_parts and Vec::from_parts, Box::from_non_null, VecDeque::retain_back, String::from_utf8_lossy_owned, std::fs::set_times and set_times_nofollow, and IntoIterator for Box<[T; N]>.

Compatibility Notes and Cargo Changes in 1.99.0 #

The detailed 1.99.0 release notes list changes that can surface in existing code:

  • The legacy integral modules are fully deprecated, so std::i32::MAX should become i32::MAX, and no_mangle_generic_items is now a hard error.
  • Macros from other crates that expand to a trailing semicolon now trigger the semicolon_in_expressions_from_non_local_macros warning; the notes ask users to report it to the crate providing the macro.
  • Iteration over exhausted RangeInclusive values changed: start(), end() and slice indexing with such ranges may behave differently.
  • Cargo disables incremental compilation by default in CI, detected through the CI environment variable, and adds a built-in debug profile, identical to dev for now.
  • Workspace members on edition 2024 or later can override an inherited dependency's default-features.
  • riscv64-unknown-linux-musl becomes Tier 2 with host tools, and the toolchain moves to LLVM 23.

i686 Windows Loses Host Tools in Rust 1.100 #

The compiler team announced that with Rust 1.100.0, i686-pc-windows-msvc moves from Tier 1 with host tools to Tier 1 without host tools, and i686-pc-windows-gnu from Tier 2 with host tools to Tier 2 without. The standard library is still built for both, and the MSVC target is still tested in CI, but the compiler is no longer distributed for them. From 1.100, toolchains cannot be installed on 32-bit Windows hosts, and 32-bit Windows binaries must be cross-compiled, for example from 64-bit Windows. The post cites compiler binaries crashing when built for i686 MSVC and the GNU toolchain running out of memory while building LLVM. Other 32-bit platforms are not affected.

Miri Stored Secrets in target/ for CI Caches #

A security post of September 21 explains that cargo miri stored all environment variables in target/. With GitHub Actions caching target/, secrets visible to the Miri step could be read by pull requests: after a maintainer approves a first PR, anyone who has landed a change can trigger CI runs. Miri now keeps only CARGO_* variables, other than CARGO_*_TOKEN, and OUT_DIR. Predrag Gruevski of OpenAI reported the issue, and a scan found one affected repository.

  1. Install Rust 1.99.1 with rustup update stable.
  2. If CI runs cargo miri with secrets in its environment and caches target/, disable that cache, scope secrets to steps that do not call Miri, or pause Miri; then clear the existing cache in every case, and consider rotating secrets that may have leaked.
  3. Replace deprecated std::i32::MAX-style paths and check code that frees memory obtained from Box::leak.
  4. Teams that build on 32-bit Windows hosts should set up cross-compilation before Rust 1.100.

The Sentinel’s Call

Every Rust user should move to 1.99.1 rather than 1.99.0, because 1.99.1 fixes a miscompilation of FFI bool return values on x86_64. Projects that run cargo miri in CI with secrets and cached target directories must clear those caches, whatever else they change. Teams on 32-bit Windows hosts need a cross-compilation setup before Rust 1.100 removes their compiler.

Our judgement, drawn only from the facts and sources above.

Sources

  1. Demoting i686 Windows targets to std-only | Rust Blog blog.rust-lang.org · Oct 2, 2026
  2. Announcing Rust 1.99.0 | Rust Blog blog.rust-lang.org · Oct 1, 2026
  3. GitHub Actions leaking secrets when Miri output is cached | Rust Blog blog.rust-lang.org · Sep 21, 2026
  4. rust-lang/rust 1.99.0: Rust 1.99.0 github.com · Oct 1, 2026
  5. rust-lang/rust 1.99.1: Rust 1.99.1 github.com · Oct 16, 2026

More on Rust

1 other article, newest first

Next reading

Edited and approved by Jarosław Krzemiński. Spotted a mistake? Report a correction or read the corrections policy.