0Pricing
C++ Academy · Pelajaran

UBSan dan TSan

Temukan perilaku tak terdefinisi dan race

UBSan dan TSan adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 3 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.

Dua Alat Sanitasi Lagi

Selain ASan, ada dua alat sanitasi yang menargetkan kelas kesalahan berbeda.

  • UBSan: perilaku tak terdefinisi (luapan, pergeseran yang salah, dereferensi null)
  • TSan: balapan data dalam kode multithread

Mengaktifkan UBSan

UndefinedBehaviorSanitizer diaktifkan dengan -fsanitize=undefined. Alat ini dapat digabungkan dengan ASan.

g++ -fsanitize=undefined -g main.cpp -o app
./app

Luapan Bilangan Bulat Bertanda

Luapan bertanda merupakan perilaku tak terdefinisi dalam C++. UBSan melaporkannya tepat di baris yang bersangkutan.

#include <climits>
#include <iostream>

int main() {
    int x = INT_MAX;
    int y = x + 1; // signed overflow: UB
    std::cout << y << "\n";
    return 0;
}

UB Lain yang Ditangkap UBSan

UBSan menandai banyak kesalahan yang sulit dikenali.

  • Pergeseran di luar rentang (x << 40 untuk bilangan bulat 32-bit)
  • Dერеferensi pointer null
  • Akses yang tidak selaras
  • Nilai enum atau bool yang tidak valid

Membuat UBSan Berhenti

Secara bawaan, UBSan mencetak laporan lalu melanjutkan. Tambahkan -fno-sanitize-recover=undefined untuk menghentikan program pada kesalahan pertama, yang lebih baik untuk integrasi berkelanjutan.

g++ -fsanitize=undefined -fno-sanitize-recover=undefined -g main.cpp -o app

Mengaktifkan TSan

ThreadSanitizer diaktifkan dengan -fsanitize=thread. Alat ini mendeteksi balapan data: dua utas mengakses memori yang sama tanpa sinkronisasi, dan setidaknya salah satunya melakukan penulisan.

g++ -fsanitize=thread -g main.cpp -o app -pthread
./app

Contoh Balapan Data

Dua utas menaikkan penghitung bersama tanpa kunci. TSan melaporkan akses yang saling berbalapan beserta tumpukannya.

#include <thread>
#include <iostream>

int counter = 0;

void work() { for (int i = 0; i < 1000; ++i) ++counter; }

int main() {
    std::thread t1(work), t2(work);
    t1.join();
    t2.join();
    std::cout << counter << "\n";
    return 0;
}

Memperbaiki Balapan Data

Lindungi data bersama dengan mutex atau gunakan std::atomic. Setelah diperbaiki, TSan tidak melaporkan balapan data apa pun.

#include <thread>
#include <atomic>
#include <iostream>

std::atomic<int> counter{0};

void work() { for (int i = 0; i < 1000; ++i) ++counter; }

int main() {
    std::thread t1(work), t2(work);
    t1.join();
    t2.join();
    std::cout << counter << "\n";
    return 0;
}

Kompatibilitas TSan dan ASan

TSan tidak dapat digabungkan dengan ASan dalam kompilasi yang sama (keduanya saling bertentangan). Gunakan konfigurasi kompilasi terpisah: satu untuk ASan+UBSan dan satu lagi untuk TSan.

Matriks Kompilasi Alat Sanitasi

Penyiapan integrasi berkelanjutan yang praktis menjalankan rangkaian pengujian dalam dua kompilasi alat sanitasi.

  • Kompilasi A: -fsanitize=address,undefined
  • Kompilasi B: -fsanitize=thread

Ini mencakup kesalahan memori, UB, dan konkurensi.

Biaya dan Batasan

TSan dapat memperlambat program 5–15 kali lipat dan menggunakan jauh lebih banyak memori. Seperti semua alat sanitasi, TSan hanya menangkap kesalahan pada jalur kode yang dijalankan, sehingga pengujian multithread yang baik sangat penting.

Pemeriksaan Cepat

Ingat kembali apa yang dideteksi TSan.

Rangkuman

Anda telah mempelajari UBSan dan TSan.

  • UBSan (-fsanitize=undefined) menemukan luapan, pergeseran yang salah, dan dereferensi null
  • Gunakan -fno-sanitize-recover untuk menghentikan program pada UB pertama
  • TSan (-fsanitize=thread) menemukan balapan data; perbaiki dengan mutex atau operasi atomik
  • TSan dan ASan memerlukan kompilasi terpisah

Pertanyaan yang Sering Diajukan

Apakah pelajaran “UBSan dan TSan” gratis?

Ya — teks lengkap “UBSan dan TSan” 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 “UBSan dan TSan”?

Temukan perilaku tak terdefinisi dan race 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 3 dari 4.

Berapa lama pelajaran “UBSan dan TSan” 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