Red Zone'u Devre Dışı Bırakmak
Red zone, fonksiyonların, stack pointer’ı ayarlamadan stack frame’lerinin altındaki 128 baytı geçici olarak kullanmasına olanak tanıyan bir System V ABI optimizasyonudur:
Görsel, n yerel değişkene sahip bir fonksiyonun stack frame’ini gösteriyor. Fonksiyona girişte, dönüş adresi ve yerel değişkenler için stack’te yer açmak amacıyla stack pointer ayarlanır.
Red zone, ayarlanmış stack pointer’ın altındaki 128 bayt olarak tanımlanır. Fonksiyon bu alanı, fonksiyon çağrıları boyunca gerekmeyen geçici veriler için kullanabilir. Böylece, stack pointer’ı ayarlamak için kullanılan iki komut bazı durumlarda (örneğin küçük yaprak (leaf) fonksiyonlarda) önlenebilir.
Ancak bu optimizasyon, exception’lar veya donanım interrupt’larıyla büyük sorunlara yol açar. Bir fonksiyon red zone’u kullanırken bir exception oluştuğunu varsayalım:
CPU ve exception handler, red zone’daki verilerin üzerine yazar. Ancak bu veri, kesintiye uğramış fonksiyon tarafından hâlâ ihtiyaç duyulan veridir. Bu yüzden exception handler’dan döndüğümüzde fonksiyon artık doğru çalışmayacaktır. Bu durum, hata ayıklaması haftalar süren tuhaf hatalara yol açabilir.
Gelecekte exception işleme uyguladığımızda bu tür hatalardan kaçınmak için, red zone’u en baştan devre dışı bırakıyoruz. Bu, hedef yapılandırma dosyamıza "disable-redzone": true satırını ekleyerek sağlanır.