Aracılığıyla paylaş


AddressSanitizer gölge baytları

Gölge bayt kavramını ve bunların çalışma zamanı uygulaması /fsanitize=addresstarafından nasıl kullanılabileceğini kısaca özetleyeceğiz. Diğer ayrıntılar için size noktalı kağıda ve AddressSanitizer algoritmasına başvuruyoruz.

Temel kavram

Uygulamanızın sanal adres alanında her 8 bayt, bir gölge bayt kullanılarak açıklanabilir.

Bir gölge bayt, şu anda erişilebilen bayt sayısını aşağıdaki gibi açıklar:

  • 0, 8 baytı da ifade eder
  • 1-7, bir-yedi bayt anlamına gelir
  • Negatif sayılar, tanılama raporlaması için kullanılacak çalışma zamanının bağlamını kodlar.

Gölge bayt göstergesi

Tüm negatif sayıların tanımlandığı bu gölge bayt göstergesini göz önünde bulundurun:

Screenshot of the AddressSanitizer shadow-byte legend.

Eşleme - adres alanınızı açıklama

Uygulamanın "0-mod-8" hizalanmış sanal adres alanında yer alan her 8 bayt, sanal adres alanında bu yuvayı tanımlayan gölge baytla eşlenebilir. Bu eşleme basit bir kaydırma ve ekleme ile gerçekleştirilebilir.

x86 tarihinde:

char shadow_byte_value = *((Your_Address >> 3) + 0x30000000)

x64'te:

char shadow_byte_value = *((Your_Address >> 3) + _asan_runtime_assigned_offset)

Kod oluşturma - testler

Belirli gölge baytların derleyici tarafından oluşturulan kod, statik veriler veya çalışma zamanı tarafından nasıl yazabileceğini düşünün. Bu sahte kod, herhangi bir yük veya depodan önce bir denetim oluşturmanın nasıl mümkün olduğunu gösterir:

ShadowAddr = (Addr >> 3) + Offset;
if (*ShadowAddr != 0) {
    ReportAndCrash(Addr);
}

8 bayttan daha küçük bir bellek başvurusu izlendiğinde, izleme biraz daha karmaşıktır. Gölge değer pozitifse (yalnızca 8 baytlık sözcüğün ilk k baytlarına erişilebileceği anlamına gelir), adresin son 3 bitini k ile karşılaştırmamız gerekir.

ShadowAddr = (Addr >> 3) + Offset;
k = *ShadowAddr;
if (k != 0 && ((Addr & 7) + AccessSize > k)) {
    ReportAndCrash(Addr);
}

Çalışma zamanı ve derleyici tarafından oluşturulan kod gölge baytlar yazar. Bu gölge baytlar kapsamlar sona erdiğinde veya depolama alanı serbest olduğunda erişime izin verir veya erişimi iptal eder. Yukarıdaki denetimler, programın yürütülmesinde belirli bir zamanda uygulamanızın adres alanında 8 baytlık "yuvaları" açıklayan gölge baytları okur. Çalışma zamanı, açıkça oluşturulan bu denetimlerin yanı sıra, CRT'deki birçok işlevi kestikten (veya "kancalar") sonra gölge baytları da denetler.

Daha fazla bilgi için, kesişen işlevlerin listesine bakın.

Gölge baytları ayarlama

Hem derleyicinin oluşturduğu kod hem de AddressSanitizer çalışma zamanı gölge bayt yazabilir. Örneğin, derleyici bir iç kapsamda tanımlanan yığın yerel öğelerine sabit boyutlu erişime izin vermek için gölge baytlar ayarlayabilir. Çalışma zamanı, veri bölümündeki genel değişkenleri gölge baytlarla çevreleyebilir.

Ayrıca bkz.

AddressSanitizer'a genel bakış
AddressSanitizer bilinen sorunları
AddressSanitizer derlemesi ve dil başvurusu
AddressSanitizer çalışma zamanı başvurusu
AddressSanitizer bulut veya dağıtılmış test
AddressSanitizer hata ayıklayıcısı tümleştirmesi
AddressSanitizer hata örnekleri