SORU
28 ŞUBAT 2011, PAZARTESİ


Yeniden NULL

Yazıyorum C kodu için bir sistem nerede adresi 0x0000 geçerli ve içeren G/Ç bağlantı noktası bu Nedenle, herhangi bir olası hatalar erişim bir NULL işaretçi kalacak fark edilmeden ve aynı zamanda neden tehlikeli bir davranış.

Bu nedenle BOŞ bir adres, örneğin geçerli olmayan bir adres olmak için yeniden tanımlamak istiyorum. Ben yanlışlıkla böyle bir adres erişim hatası halledebilirim nerede bir donanım kesmesi alacağım. Stddef erişimi var.bu derleyici için h, aslında standart Başlığı değiştirir ve BOŞ yeniden tanımlamak istiyorum.

Benim soru şudur: bu C standardı ile çakışacak? Standart 7.17 söyleyebilirim kadarıyla, makro uygulama tanımlı. Başka bir yerde standart NULL belirten bir şey vargerekir0?

Başka bir sorun, derleyici bir sürü sıfır, veri türü olursa olsun her şeyi ayarlayarak statik başlatma gerçekleştirin. Standart derleyici sıfır ve işaretçiler tamsayılar NULL olarak ayarlayın gerektiğini söylüyor olsa bile. Eğer benim derleyici NULL yeniden tanımlanacak olsaydı, o zaman bu statik başlatma başarısız olacağını biliyorum. Ben cesaretle derleyici başlıkları el ile değişmiş olsa bile, derleyici hatalı bir davranış olarak kabul edebilir miyim? Bu özel derleyici statik başlatma yaparken BOŞ makro erişim olmadığını kesin olarak biliyorum çünkü.

CEVAP
28 ŞUBAT 2011, PAZARTESİ


C standart null işaretçiler makinenin adrese sıfır olmasını gerektirmez. ANCAK, 0 bir işaretçi değeri sürekli döküm NULL işaretçi (§6.3.2.3/3) neden gerekir, ve bir boolean olarak bir boş gösterici değerlendirmek yanlış olmalı. Bu gerçekten biraz garip olabiliryapınsıfır bir adres istiyorum, ve NULL sıfır adresidir.

Yine de, (ağır) derleyici ve standart kütüphane değişiklikler ile, imkansız değil NULL hala standart kütüphaneye kesinlikle uyumlu kalarak alternatif bir model ile temsil edilecek.değilsonra NULL true sonucunu, sadece NULL kendisi tanımı ancak değiştirmek için yeterli.

Özellikle, gerekir:

  • İşaretçileri (veya işaretçiler yayınları) atamaları -1 gibi başka sihirli bir değer haline dönüştürülecek literal sıfır düzenleyecektir.
  • İşaretçiler ve sabit bir tam sayı 0 sihirli değeri (§6.5.9/6) yerine kontrol etmek için eşitliği testler için düzenlemek
  • Hangi işaretçi bir tür büyü değeri için eşitlik için kontrol etmek için bir boolean olarak değerlendirilmesi yerine sıfır denetliyor kullanmak için düzenlemek. Bu eşitlik mantığı test izler, ama derleyici farklı DAHİLİ olarak uygulayabilir. §6.5.13/3, §6.5.14/3, §6.5.15/4, §6.5.3.3/5, §6.8.4.1/2, §6.8.5/4 bakın
  • Caf belirttiği gibi, nesneleri (§6.7.8/10) ve kısmi bileşik başlatıcılar statik (§6.7.8/21) yeni bir null işaretçi gösterimi yansıtacak şekilde başlatılması için semantik güncelleştirin.
  • Alternatif bir yol, doğru adres sıfır erişim oluşturun.

Yaptığın bazı şeyler vardırdeğilişlemek zorunda. Örneğin:

int x = 0;
void *p = (void*)x;

Bu, p boş gösterici olmasını garanti edilmez sonra. Değişmeyen tek şey (bu sıfır doğru adres erişmek için iyi bir yaklaşımdır). Aynı şekilde:

int x = 0;
assert(x == (void*)0); // CAN BE FALSE

Ayrıca:

void *p = NULL;
int x = (int)p;

x 0 garanti edilmez.

Kısacası, bu durum görünüşe göre C dil Komitesi ve düşünceler BOŞ için alternatif bir temsili tercih eden tarafından kabul edildi. Tüm yapmanız gereken şimdi derleyici, ve hey presto bitti:) büyük değişiklikler yapmak

Bir yan not olarak, derleyici doğru önce kaynak kodu dönüşümü bir sahne ile bu değişiklikleri uygulamak mümkün olabilir. Bu kadar basit normal akışını yerine ->derleyici ->çevirici ->linker, basit - ^ eklemek istiyorum . BOŞ dönüşümü ->derleyici ->çevirici ->linker. O zaman dönüşümleri gibi yapabilirsin:

p = 0;
if (p) { ... }
/* becomes */
p = (void*)-1;
if ((void*)(p) != (void*)(-1)) { ... }

Bu tam bir C çözümleyici olarak typedefs ve değişken bildirimleri tür ayrıştırıcı ve analiz göstericiler karşılık belirlemek için gerektirir. Ancak bu şekilde, derleyici kod oluşturma kısımlarına uygun değişiklikleri yapmak zorunda önlemek olabilir. clang Bu uygulama için yararlı olabilir aklımda böyle dönüşümler ile tasarlanmış olduğunu anlıyorum. Yine de büyük olasılıkla standart kütüphane tabii ki de değişiklik yapmak gerekir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Anthony Le

    Anthony Le

    10 EKİM 2006
  • Thom Hall

    Thom Hall

    24 Kasım 2006
  • XxMinayaxX1

    XxMinayaxX1

    9 Mayıs 2012