0Pricing
C++ Academy · Ders

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 app

TSan'ı 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
./app

Veri 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-recover kullanı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.

Bu kursun tüm dersleri

  1. gdb ve lldb Kullanımı
  2. AddressSanitizer
  3. UBSan ve TSan
  4. Valgrind Temelleri
← C++ Academy Sayfasına Dön