0Pricing
C++ Academy · Pelajaran

AddressSanitizer

Tangkap error memori

AddressSanitizer adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.

Apa Itu AddressSanitizer

AddressSanitizer (ASan) adalah alat berbasis kompilator yang mendeteksi kesalahan memori saat program berjalan: akses di luar batas, penggunaan setelah dibebaskan, pembebasan ganda, dan kebocoran. Alat ini cukup cepat untuk pengujian sehari-hari.

Mengaktifkan ASan

Tambahkan -fsanitize=address saat kompilasi dan penautan, serta -g agar laporan mudah dibaca.

g++ -fsanitize=address -g -O1 main.cpp -o app
./app

Luapan Penyangga Memori Dinamis

ASan menandai pembacaan atau penulisan yang melewati penyangga yang dialokasikan. Program ini menulis satu elemen terlalu jauh.

#include <cstdlib>

int main() {
    int* a = (int*)malloc(3 * sizeof(int));
    a[3] = 7; // out of bounds
    free(a);
    return 0;
}

Menggunakan Memori Setelah Dibebaskan

Mengakses memori setelah dibebaskan merupakan perilaku tak terdefinisi; ASan melaporkan penggunaan-memori-dinamis-setelah-dibebaskan beserta tumpukan saat memori dibebaskan dan dialokasikan.

#include <cstdlib>

int main() {
    int* p = (int*)malloc(sizeof(int));
    free(p);
    *p = 5; // use after free
    return 0;
}

Luapan Penyangga Tumpukan

ASan juga menginstrumentasikan larik pada tumpukan sehingga dapat menangkap penulisan yang melewati batas penyangga lokal.

#include <iostream>

int main() {
    int buf[3] = {0, 0, 0};
    for (int i = 0; i <= 3; ++i) buf[i] = i; // i==3 overflows
    std::cout << buf[0] << "\n";
    return 0;
}

Membaca Laporan

Laporan ASan mencantumkan jenis kesalahan, alamat yang menyebabkan kesalahan, serta jejak tumpukan untuk akses yang bermasalah dan alokasi atau pembebasan yang terkait. Kerangka tumpukan pertama biasanya menunjuk langsung ke kesalahan.

Deteksi Kebocoran

ASan menyertakan LeakSanitizer di banyak platform. Alat ini melaporkan memori yang tidak pernah dibebaskan saat program keluar, beserta tumpukan alokasinya.

#include <cstdlib>

int main() {
    int* leaked = (int*)malloc(100); // never freed
    return 0;
}

Opsi Saat Berjalan

Sesuaikan perilaku dengan variabel lingkungan ASAN_OPTIONS, misalnya ASAN_OPTIONS=detect_leaks=1:halt_on_error=0.

Biaya Kinerja

ASan biasanya memperlambat program sekitar 2 kali lipat dan meningkatkan penggunaan memori. Hal ini dapat diterima untuk pengujian dan integrasi berkelanjutan, tetapi Anda tidak akan menyertakannya dalam kompilasi rilis.

Gabungkan dengan Pengujian

Jalankan pengujian unit Anda dengan ASan dalam integrasi berkelanjutan. Banyak kesalahan nyata hanya muncul ketika dipicu oleh pengujian dengan alat sanitasi yang aktif. Pertahankan konfigurasi kompilasi alat sanitasi khusus.

Bukan Pengganti Kehati-hatian

ASan hanya menemukan kesalahan pada jalur kode yang benar-benar Anda jalankan. Padukan dengan cakupan pengujian yang baik; cabang bermasalah yang tidak dijalankan akan tetap tersembunyi.

Pemeriksaan Cepat

Ingat kembali cara mengaktifkan ASan.

Rangkuman

Anda telah mempelajari AddressSanitizer.

  • Mendeteksi akses di luar batas, penggunaan setelah dibebaskan, pembebasan ganda, dan kebocoran
  • Aktifkan dengan -fsanitize=address -g
  • Laporan mencantumkan kesalahan serta menampilkan tumpukan alokasi dan pembebasan
  • Sekitar 2 kali lebih lambat; ideal untuk pengujian dan integrasi berkelanjutan, bukan untuk rilis

Pertanyaan yang Sering Diajukan

Apakah pelajaran “AddressSanitizer” gratis?

Ya — teks lengkap “AddressSanitizer” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “AddressSanitizer”?

Tangkap error memori Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C++ Academy?

Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “AddressSanitizer” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?

Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Menggunakan gdb dan lldb
  2. AddressSanitizer
  3. UBSan dan TSan
  4. Dasar-Dasar Valgrind
← Kembali ke C++ Academy