Yardım gcc->clang

  • Konuyu açan Konuyu açan renaissance
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 2
  • Gösterim Gösterim 81
Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

renaissance

Üye
Üye
Mesaj
53
Beğeni
19
Puan
306
Ticaret Puanı
0
Selamlar herkese, sunucu kaynağında yaptığım bir değişiklikten dolayı memory corruption olduğunu düşünüyorum.

Normalde descriptor’u olmaması gereken entityler GetDesc sonucu 0x1, 0x1b gibi invalid pointerlar döndürüyor bu da sunucun core verip çökmesine sebep oluyor.

Bu hatayı çözmek için fazlaca deneme yaptım her seferinde farklı bir yerde aynı hata ile karşılaştım.

ASan kullanmak istedim fakat gcc10 ile derlediğim için uygun değildi, gcc11 e de geçiremedim dosyalarımı (freebsd portlarında mysql56 kaldırılması sıfırdan kuramamam gcc ile derlediğim liblerde hata almam portların 14.2 dışında kapalı olması gibi) en mantıklısı clang ile derlemek gibi geliyor gcc den server kaynağımı clang’e çevirip derlemek için hangi adımları izlemeliyim, bilgisi olan bilgilendirebilecek var mı?

Teşekkürler
 
Sizin yazdığınız sorunu direkt olarak yapay zekaya verdiğimde ki önerileri paylaşmak istiyorum. Tabi ki %100 doğru olmayabilir ancak belki size bir fikir verir ve çözüme ulaşmanızı kolaylaştırabilir. Cevaplar o4-mini-high tarafından verilmiştir.

Olası Sebep/Tahminler​


  1. Struct/enum değişikliği (“layout shift”)
    • Kaynağında yeni bir alan eklediysen Descriptor ya da Entity yapısına, ama tüm modüller hâlâ eski boyuta göre derlendi.
    • Sonuç: GetDesc() geri döndüğü pointer’ı yanlış offset’ten okuyor → 0x1, 0x1b gibi anlamsız değerler.
  2. Use-after-free / double-free
    • Bir entity silinirken descriptor havuzundan yanlış indeks serbest bırakılıyor olabilir.
    • Sonra aynı adrese başka bir veri yazılıyor, getirilmeye çalışıldığında bozuk pointer dönüyor.
  3. Concurrency/race condition
    • Bir thread descriptor’u alıyor, diğer thread o sırada serbest bırakıyor. Kilit (mutex) eksikliği veya yanlış kullanım bellek bozulmasına yol açar.
  4. Packet/protocol uyumsuzluğu
    • Kaynakta değişiklik yaparken client-server paket formatını güncellemedin mi? Yanlış veri parse edildikçe descriptor tablosu kaydırılabilir.
  5. Mempool veya slab allocator taşması
    • Eğer custom bir bellek havuzu (mempool) kullanıyorsan, yanlış boyut veya yanlış granularity yüzünden bitişik nesne üzerine yazma olabilir.


    • Clang + ASan ile Derleme Adımları (FreeBSD)​

      1. Clang/LLVM paketi yükle
      2. sh:
        Genişlet Daralt Kopyala
        pkg install llvm13
        # veya
        pkg install clang

        Çevre değişkenlerini ayarla

      3. sh:
        Genişlet Daralt Kopyala
        export CC=/usr/local/clang13/bin/clang
        export CXX=/usr/local/clang13/bin/clang++

        ASan bayraklarını ekle

      4. sh:
        Genişlet Daralt Kopyala
        export CFLAGS="-g -O1 -fsanitize=address -fno-omit-frame-pointer"
        export CXXFLAGS="$CFLAGS"


      5. Makefile’da CC/CXX kontrollerini geçersiz kıl (isteğe bağlı)
        game/src/Makefile içine başa şu satırları ekleyebilirsin:

      6. makefile:
        Genişlet Daralt Kopyala
        CC      ?= $(CC)
        CXX     ?= $(CXX)
        CFLAGS  += $(CFLAGS)
        CXXFLAGS+= $(CXXFLAGS)

        Veya terminalden:

      7. sh:
        Genişlet Daralt Kopyala
        cd game/src
        gmake clean
        gmake CC=$CC CXX=$CXX CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" -j$(sysctl -n hw.ncpu)


      8. Sunucuyu ASan’lı çalıştır
        Derleme tamamlandıktan sonra:

      9. sh:
        Genişlet Daralt Kopyala
        ./metin2server   # ASan raporlarını standart çıktıda göreceksin



      10. Özet:
        • İlk önce “pointer offset” ve “free/reuse” gibi memory corruption senaryolarını gözden geçir.
        • Derleme aşamasında Clang + ASan kullanmak, hatanın kaynağına inmenin en hızlı yolu. Yukarıdaki adımlarla FreeBSD’de GCC’den Clang’e geçişi ve ASan’ı devreye almayı deneyebilirsin.
        • ASan çıktısını paylaşırsan, tam olarak hangi satır ve çağrı dizisinde bozulma olduğunu da görebiliriz
 
Geri
Üst