Checked Pointer

Keamanan pointer melalui migrasi checked pointer sebagaimana dipublikasikan dokumen desain.

Daftar isi

Topik ini membahas bagaimana desain keamanan Carbon memperlakukan pointer, yaitu dari operasi tanpa jaminan menjadi penggunaan yang diperiksa compiler. Setelah membacanya, anatomi bug use after free yang menjadi sasaran utama, mekanisme place dan place set yang dipublikasikan dokumen desain, serta batas antara yang dapat dicoba di Explorer dan yang masih berupa desain dapat dibedakan dengan tepat. Topik ini menggunakan istilah checked pointer sebagai nama konsep, yaitu pointer yang penggunaannya diperiksa compiler, sedangkan dokumen resmi Carbon menyatakannya melalui frasa compiler-checked memory safety beserta mekanismenya.

Masalah yang menjadi sasaran: use after free#

Dokumen istilah pada desain keamanan Carbon mendefinisikan temporal safety sebagai jaminan bahwa akses memori hanya terjadi dalam masa hidup objek yang dituju. Pelanggaran yang paling dikenal adalah use after free, yaitu penggunaan pointer setelah memori yang ditunjuknya dibebaskan, dan keadaan pointernya disebut dangling pointer. Materi deep dive keamanan memori Carbon yang dipublikasikan pada 2026 menguraikan anatomi bug ini sebagai empat langkah yang selalu sama.

  1. Alokasi, misalnya container mengalokasikan memori di heap untuk menyimpan elemennya.
  2. Penangkapan, yaitu alamat ke dalam alokasi tersebut disimpan pada sebuah pointer.
  3. Pembebasan atau relokasi, yaitu dealokasi atau penyalinan ulang yang membuat alamat tersimpan menjadi menggantung.
  4. Penggunaan, yaitu pointer menggantung itu didereferensikan.

Dalam C++, keempat langkah itu sah menurut aturan bahasa, sehingga kesalahannya baru terlihat saat program berjalan, dan dalam banyak kasus tidak terlihat sama sekali. Dokumen strategi keamanan menempatkan masalah ini dalam kerangka yang lebih luas, yaitu keamanan spasial untuk akses di luar batas, keamanan inisialisasi untuk data yang belum diisi, keamanan tipe, dan keamanan data race, dengan keamanan temporal sebagai bagian yang ditangani lewat sistem tipe pada waktu kompilasi.

Place dan place set sebagai fondasi pemeriksaan#

Desain yang dipublikasikan membangun pemeriksaannya di atas konsep place, yakni tempat penyimpanan yang diketahui compiler pada waktu kompilasi. Setiap binding memiliki satu place, yang ditulis dengan awalan tanda sirkumfleks, misalnya ^x untuk place dari variabel x. Tipe sebuah pointer memuat place set, yaitu himpunan place yang mungkin ditunjuknya, sehingga mengambil alamat elemen pertama dari buffer x menghasilkan tipe yang membawa place set ^x.Elts, bukan sekadar alamat mentah. Tipe pemilik (owning type) mendeklarasikan kepemilikan atas place set miliknya secara eksplisit.

Deklarasi berikut adalah penyederhanaan dari bagian kelas buf pada materi deep dive, yaitu padanan Carbon untuk std::vector dalam C++.

carbon Contoh: kepemilikan dan invalidasi pada tipe buf menurut desain
// tidak-dijalankan
class buf(T: ...) {
  disjoint owned ^Elts of T;
  fn PushBack(ref self, x: T) invalidate(^Elts);
}

Dua baris deklarasi itu memuat seluruh mekanisme pemeriksaan. Baris disjoint owned ^Elts of T menyatakan bahwa buf memiliki satu alokasi terpisah untuk elemen-elemennya, sedangkan efek invalidate(^Elts) pada PushBack menyatakan bahwa pemanggilannya membuat semua pointer yang menunjuk ke elemen buf menjadi tidak sah. Apabila sebuah pointer ditangkap sebelum pemanggilan dan didereferensikan setelahnya, compiler menolak program tersebut dengan error pada baris penggunaannya, persis pada langkah keempat anatomi bug di atas. Materi sumbernya sendiri mencatat bahwa contoh pada slide disederhanakan, misalnya nama lengkapnya Core.Buf dan implementasinya menggunakan tipe HeapArray di dalamnya.

Mekanisme yang sama menopang beberapa keputusan desain lain yang dipublikasikan. Kepemilikan bersifat tunggal, sehingga hanya pemilik yang dapat membuat pointer lain tidak sah, pemilik sendiri tidak pernah menjadi tidak sah, dan double free tidak dapat ditulis. Warisan antarmuka dari C++ atau reference counting seperti pada shared_ptr dimodelkan sebagai pointer ke satu pemilik, bukan kepemilikan ganda. Perbedaan yang paling mencolok dibandingkan Rust juga dimuat dalam desain, yaitu pointer mutabel yang boleh saling beralias dengan syarat place-nya dinyatakan terpisah, sehingga pola C++ seperti menukar dua elemen vector pada indeks yang mungkin sama tetap dapat ditulis tanpa unsafe.

Yang dapat dan tidak dapat dibuktikan hari ini#

Bagian pemeriksaan di atas adalah desain, dan kejujuran status menuntut pemisahan yang tegas terhadap yang sudah berjalan. Program berikut mengeksekusi dasar-dasar pointer di Explorer, yaitu mengambil alamat dan mendereferensikannya.

carbon pointer-dasar.carbon
package sample api;

fn Main() -> i32 {
  var x: i32 = 7;
  var p: i32* = &x;
  var y: i32 = *p;
  Print("y = {0}", y);
  return 0;
}
text Keluaran
y = 7
result: 0

Sintaks alamat dan dereferensi diterima dan dijalankan, tetapi program ini tidak membuktikan apa pun tentang keamanan. Tidak ada realokasi heap di dalamnya, tidak ada place set yang diperiksa, dan pemeriksaan invalidasi belum ada di alat tersebut. Komentar pemelihara proyek pada bulan Juli 2026 menyatakan secara eksplisit bahwa desain keamanan memori belum mulai diimplementasikan pada toolchain, sehingga seluruh mekanisme pada bagian sebelumnya berstatus rancangan yang dipublikasikan untuk masukan komunitas.

Cara membaca status yang benar juga tampak dari rencana penerapannya. Desain tersebut diarahkan ke mode strict Carbon, sedangkan kode hasil migrasi C++ berjalan di mode permissive tanpa anotasi keamanan. Peningkatan status dari permissive ke strict direncanakan berlangsung bertahap dengan menambah anotasi pada fungsi dan tipe yang bersangkutan, dan strategi dua langkah yang menaunginya ditetapkan pada dokumen strategi keamanan proyek.

Ringkasan#

  • Sasaran utama desain adalah use after free, yang anatomianya terdiri atas alokasi, penangkapan alamat, pembebasan atau relokasi, dan penggunaan pointer menggantung.
  • Pemeriksaan dibangun di atas place dan place set, yaitu tipe pointer membawa himpunan place yang mungkin ditunjuk, tipe pemilik mendeklarasikan owned ^Elts, dan fungsi yang merelokasi menandai efek invalidate.
  • Variabel lokal dianalisis tanpa anotasi lewat analisis alur, kepemilikan tunggal mencegah double free, dan pointer mutabel beralias tetap dapat ditulis dengan deklarasi place terpisah.
  • Explorer hanya dapat mengeksekusi sintaks pointer dasar tanpa pemeriksaan, dan pemelihara proyek menyatakan desain keamanan memori belum mulai diimplementasikan pada toolchain.

Referensi#