âš¡ Jawaban Singkat / Key Takeaways

Rust 2024 edition memperkenalkan gen dan raw sebagai keyword baru yang bisa bikin crate-mu gagal compile tanpa error message yang jelas. Plus, lint unsafe_op_in_unsafe_fn, rust_2024_prelude_collisions, dan perubahan unsafe extern bikin codebase besar ambyar diam-diam. Checklist di artikel ini bantu kamu siapkan Cargo.toml, perbaiki syntax, dan update CI sebelum upgrade ke Rust 1.85.

Kamu Upgrade Rust 1.85, Crate 150 Ribu Baris Malah Error 300+

Kamu maintainer crate dengan 40 dependensi dan 150 ribu baris kode. Rust 1.85 rilis dan tim bilang: “ayo coba edition 2024, katanya lebih aman.” Kamu ganti edition = "2024" di Cargo.toml, jalanin cargo build, lalu layar penuh warna merah. 300+ error. Banyak yang bahkan nggak masuk akal: kenapa variabel namanya gen tiba-tiba invalid? Kenapa unsafe block yang udah 4 tahun baik-baik aja sekarang kena warning keras?

Ini bukan bug compiler. Ini behaviour yang didokumentasikan di Rust 2024 Edition Guide, cuma dokumentasinya tersebar di 12 halaman berbeda dan nggak ada checklist terpusat yang bisa kamu ikuti. Artikel ini ngasih kamu checklist itu.

Rust 2024 edition compatibility dengan keyword gen dan raw yang bikin crate error

Keyword Baru yang Nggak Kamu Sadari: gen dan raw

Ini jebakan paling fatal. Rust 2024 edition mereservasi gen dan raw sebagai keyword penuh. Bukan soft keyword, bukan contextual keyword, tapi hard keyword yang nggak bisa kamu pakai sebagai identifier. Kalau kamu legacy crate, kemungkinan besar ada variabel, fungsi, atau field bernama gen atau raw.

Kenapa gen Jadi Keyword?

gen dipersiapkan untuk fitur gen blocks di nightly yang memungkinkan coroutine dengan syntax mirip async. Kamu mungkin belum pakai, tapi ekosistem sedang menuju ke sana. Jadi Rust compiler team memutuskan: reserve sekarang, hindari breakage massal nanti.

  • Cek variabel bernama gen: rg '\bgen\b' --type rust
  • Cek fungsi bernama gen: rg 'fn gen\b' --type rust
  • Cek field struct: rg '\.gen\b' --type rust

Fix: rename jadi generator, gen_fn, atau r#gen (raw identifier) untuk yang butuh kompatibilitas backward sementara. Tapi hati-hati, r#gen cuma solusi jangka pendek karena nanti gen bakal fully reserved.

Cargo build error karena keyword gen bentrok dengan nama variabel di Rust 2024 edition
Script grep sederhana bisa selamatkan crate-mu dari ratusan error kompilasi

Lint unsafe_op_in_unsafe_fn: Bom Waktu di Codebase 2021

Di edition 2024, unsafe_op_in_unsafe_fn diaktifkan secara default sebagai deny-by-default lint. Artinya, setiap fungsi bertanda unsafe fn nggak ngasih akses unsafe secara otomatis ke body-nya. Kamu harus eksplisit bungkus operasi unsafe dalam unsafe { } block.

Di edition 2021, kode ini aman:

unsafe fn dangerous(x: *const u8) -> u8 {
    *x  // implicit unsafe, no block needed
}

Di edition 2024, langsung error. Harus:

unsafe fn dangerous(x: *const u8) -> u8 {
    unsafe { *x }  // explicit block
}

Fix massal: Jangan manual satu-satu. Pakai cargo fix --edition yang otomatis nambahin unsafe blocks. Tapi awas: cargo fix kadang overcorrect dan nambahin unsafe { } di tempat yang nggak perlu. Always review diff-nya sebelum commit.

unsafe extern: Kenapa FFI-mu Bisa Rusak Diam-Diam

Ini jebakan paling underrated. Di edition 2024, semua deklarasi extern harus ditandai sebagai safe atau unsafe. Deklarasi tanpa marker akan error.

// Edition 2021: fine
extern "C" {
    fn open(path: *const c_char) -> i32;
}

// Edition 2024: HARUS unsafe extern
unsafe extern "C" {
    fn open(path: *const c_char) -> i32;
}

Kamu yang maintain crate dengan binding C library (OpenSSL, Postgres, LevelDB), semua FFI block harus disentuh. cargo fix --edition bisa bantu, tapi binding yang di-generate otomatis (misalnya via bindgen) perlu regenerasi.

Checklist Upgrade: Dari Cargo.toml Sampai CI

1. Audit Identifier Global

# Deteksi keyword bentrok di seluruh workspace
rg '\b(gen|raw)\b' --type rust -l | sort -u

Output ini adalah daftar file yang wajib kamu review. Jangan skip satu pun.

2. Simulasi Edition 2024 Sebelum Upgrade

# Di Cargo.toml, jangan langsung ganti edition. Coba per-crate:
[package]
name = "my-legacy-crate"
edition = "2024"  # dari "2021"

Lalu jalanin cargo check. Error yang muncul adalah checklist real-time buat crate itu. Ulangi per crate, bukan sekaligus di workspace root.

3. Apply cargo fix Bertahap

# Step 1: dry-run
cargo fix --edition --allow-dirty --dry-run

# Step 2: review diff
git diff

# Step 3: apply per crate
cargo fix --edition --allow-dirty -p my-crate

Peringatan: cargo fix --edition mengubah source code-mu secara otomatis. Commit dulu semua perubahan sebelum jalanin command ini. Selalu review diff-nya.

perbandingan Cargo.toml edition 2021 vs 2024 dengan fitur unsafe_op_in_unsafe_fn
Ubah edition di Cargo.toml per-crate, bukan sekaligus

4. Update CI Pipeline

  • Pastikan CI pakai Rust >= 1.85. Tambahin di .github/workflows/ci.yml: toolchain: 1.85
  • Tambahin job terpisah untuk edition 2024: cargo check --edition 2024
  • Tambahin RUSTFLAGS="-D rust_2024_compatibility" untuk deny semua warning edition-migration
  • Jangan lupa update clippy dan rustfmt: edition 2024 bawa formatting rule baru

5. Dependency yang Belum Siap

Cek workspace-mu: apakah semua dependensi sudah support edition 2024? Kalau ada crate dependen yang masih 2018 atau 2021, crate kamu bisa upgrade duluan karena Rust mendukung multi-edition compilation. Tapi kalau ada proc-macro dependen yang masih 2021, tunda upgrade sampai dependen tersebut upgrade.

# Cek edition semua dependensi
cargo metadata --format-version=1 | jq '.packages[] | {name: .name, edition: .edition}'

Proc-macro crate perlu perhatian ekstra karena mereka berjalan di compiler host yang sama. Mismatch edition antara proc-macro dan crate pemanggil bisa bikin error cryptic yang susah di-debug.

CI pipeline GitHub Actions gagal setelah upgrade Rust 2024 edition tanpa persiapan
CI pipeline yang terkonfigurasi dengan baik adalah safety net sebelum merge ke main branch

Yang Sering Terlewat: Prelude Collision dan unsafe_attr_outside_unsafe

Rust 2024 nambahin beberapa item baru ke standard prelude. Kalau crate-mu punya item dengan nama yang sama (misalnya Future, IntoFuture, TryInto), bakal ada ambiguity resolution yang bikin compiler bingung. Gunakan rust_2024_prelude_collisions lint untuk deteksi dini.

Selain itu, unsafe_attr_outside_unsafe juga deny-by-default. Setiap #[no_mangle] atau #[export_name] di luar unsafe context bakal ditolak. Kalau crate-mu pakai FFI attributes di safe Rust, ini bakal break.

Baca juga: Setelah upgrade edition 2024, pastikan native async trait di Rust 1.85 sudah menggantikan async_trait crate-mu biar compile time turun signifikan. Sementara itu, kalau kamu sering debugging async panic di production, backtrace ter-annotasi di Rust 1.85 bakal bikin hidupmu lebih tenang. Jangan lewatkan juga perubahan NLL borrow checker yang bikin self-referential pattern lolos kompilasi.

FAQ

Apa itu Rust edition dan bedanya sama Rust version?

Rust version (1.85, 1.86) adalah rilis compiler. Rust edition (2015, 2018, 2021, 2024) adalah set aturan kompatibilitas yang kamu pilih per-crate di Cargo.toml. Kamu bisa pakai Rust 1.85 compiler tapi crate-mu tetap di edition 2021. Edition nggak perlu di-upgrade barengan dengan compiler.

Apakah harus upgrade ke edition 2024?

Nggak wajib. Edition 2021 tetap didukung penuh oleh Rust compiler selamanya. Tapi kalau crate-mu ingin pakai fitur eksklusif edition 2024 seperti gen blocks (ketika stabil), async closures, atau unsafe extern safety, upgrade diperlukan. Juga, komunitas Rust cenderung pindah ke edition terbaru dalam 1-2 tahun setelah rilis.

Gimana cara tahu crate saya siap edition 2024?

Jalanin cargo check --edition 2024 di root workspace. Kalau output bersih (0 error, 0 warning), crate-mu siap. Kalau ada warning soal rust_2024_compatibility, tambahkan RUSTFLAGS="-D rust_2024_compatibility" untuk deny semua warning tersebut dan lihat mana yang wajib difix. Tools tambahan: cargo-semver-checks untuk validasi bahwa upgrade-mu nggak merusak semver.

Kenapa cargo fix nggak bisa fix semua masalah?

cargo fix hanya menangani perubahan yang punya migrasi otomatis (seperti wrapping unsafe ops). Untuk identifier conflict seperti gen dan raw, atau perubahan structural seperti unsafe extern di binding yang di-generate, kamu harus intervensi manual. cargo fix adalah alat bantu, bukan solusi penuh.

Kesimpulan

Rust 2024 edition bukan sekadar ganti angka di Cargo.toml. Keyword gen dan raw, default unsafe_op_in_unsafe_fn, unsafe extern requirement, dan prelude collision adalah empat jebakan utama yang bisa bikin CI-mu merah berhari-hari. Tapi dengan checklist di artikel ini, kamu bisa siapkan codebase, fix syntax otomatis dengan cargo fix, dan update CI sebelum merge ke main branch.

Mau upgrade project Rust besar tanpa drama? Ikuti checklist ini step-by-step. Dan kalau kamu nemuin edge case lain yang nggak dibahas di sini, share di kolom komentar biar sesama maintainer terbantu.

Referensi: Rust 2024 Edition Guide, Rust 1.85 Release Blog, Rust Unstable Book – gen blocks.

]]>

About the Author

Dzul Qurnain

Suka nonton Anime, ngoding dan bagi-bagi tips kalau tahu.. Oh iya, suka baca ( tapi yang menarik menurutku aja)... Praktisi WordPress, web development, SEO, dan server administration yang membagikan tutorial teknis dan catatan implementasi nyata.

View All Articles