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
./appLuapan 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 << 40untuk 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 appMengaktifkan 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
./appContoh 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-recoveruntuk 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.