AddressSanitizer gölge baytları
Gölge bayt kavramını ve bunların çalışma zamanı uygulaması /fsanitize=address
tarafından nasıl kullanılabileceğini kısaca özetleyeceğiz. Daha fazla ayrıntı için ilk araştırma olan AddressSanitizer - Serebryany, et al ve geçerli AddressSanitizer algoritması belgelerine göz atın.
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:
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