UBSan ve TSan
Tanımsız davranışları ve yarışları bulun
UBSan ve TSan, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.
İki Ek Hata Denetleyicisi
ASan'ın ötesinde, iki hata denetleyici farklı hata sınıflarını hedefler.
- UBSan: tanımsız davranış (taşma, hatalı bit kaydırma, boş gösterici başvurusu)
- TSan: çok iş parçacıklı kodda veri yarışları
UBSan'ı Etkinleştirme
UndefinedBehaviorSanitizer, -fsanitize=undefined ile etkinleştirilir. ASan ile birleştirilebilir.
g++ -fsanitize=undefined -g main.cpp -o app
./appİşaretli Tamsayı Taşması
İşaretli tamsayı taşması, C++'ta tanımsız davranıştır. UBSan bunu tam olarak gerçekleştiği satırda bildirir.
#include <climits>
#include <iostream>
int main() {
int x = INT_MAX;
int y = x + 1; // signed overflow: UB
std::cout << y << "\n";
return 0;
}UBSan'ın Yakaladığı Diğer UB Durumları
UBSan birçok ince hatayı bildirir.
- Aralık dışı bit kaydırmaları (32 bitlik tamsayı için
x << 40) - Boş gösterici başvurusu
- Hizalanmamış erişim
- Geçersiz numaralandırma veya doğru/yanlış değerleri
UBSan'ı Durdurma
Varsayılan olarak UBSan yazdırır ve devam eder. İlk hatada durdurmak için -fno-sanitize-recover=undefined ekleyin; bu, sürekli tümleştirme için daha uygundur.
g++ -fsanitize=undefined -fno-sanitize-recover=undefined -g main.cpp -o appTSan'ı Etkinleştirme
ThreadSanitizer, -fsanitize=thread ile etkinleştirilir. Veri yarışlarını algılar: iki iş parçacığı, aralarında eşzamanlama olmadan aynı belleğe erişir ve bunlardan en az biri yazma işlemi gerçekleştirir.
g++ -fsanitize=thread -g main.cpp -o app -pthread
./appVeri Yarışı Örneği
İki iş parçacığı, kilit kullanmadan paylaşılan bir sayacı artırır. TSan, yarışan erişimleri ve bunların yığınlarını bildirir.
#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;
}Yarışı Düzeltme
Paylaşılan verileri bir karşılıklı dışlama nesnesiyle koruyun veya std::atomic kullanın. Düzelttikten sonra TSan hiçbir yarış bildirmez.
#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;
}TSan ve ASan Uyumluluğu
TSan, aynı derlemede ASan ile birleştirilemez (çakışırlar). Ayrı derleme yapılandırmaları kullanın: biri ASan+UBSan, diğeri TSan için.
Hata Denetleyicisi Derleme Matrisi
Uygulamalı bir sürekli tümleştirme kurulumu, sınama paketini iki hata denetleyicisi derlemesinde çalıştırır.
- A derlemesi:
-fsanitize=address,undefined - B derlemesi:
-fsanitize=thread
Bu kurulum bellek, UB ve eşzamanlılık hatalarını kapsar.
Maliyetler ve Sınırlamalar
TSan programları 5-15 kat yavaşlatabilir ve çok daha fazla bellek kullanabilir. Tüm hata denetleyicilerinde olduğu gibi yalnızca yürütülen kod yollarındaki hataları yakalar; bu nedenle iyi çok iş parçacıklı sınamalar önemlidir.
Hızlı Kontrol
TSan'ın neyi algıladığını hatırlayın.
Özet
UBSan ve TSan'ı öğrendiniz.
- UBSan (
-fsanitize=undefined) taşmaları, hatalı bit kaydırmalarını ve boş gösterici başvurularını bulur - İlk UB durumunda durdurmak için
-fno-sanitize-recoverkullanın - TSan (
-fsanitize=thread) veri yarışlarını bulur; karşılıklı dışlama nesnesi/atomik işlemle düzeltin - TSan ve ASan için ayrı derlemeler gerekir
Sıkça Sorulan Sorular
“UBSan ve TSan” dersi ücretsiz mi?
Evet — “UBSan ve TSan” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.
“UBSan ve TSan” dersinde ne öğreneceğim?
Tanımsız davranışları ve yarışları bulun C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C++ Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“UBSan ve TSan” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.