SORU
7 Temmuz 2012, CUMARTESİ


Erişim etkin olmayan sendika üyesi tanımsız?

Ben izlenim altında olduğunu erişme union Üye dışında son bir oteldir İK, ama ben bulamıyorum sağlam bir referans (başka cevaplar olduğunu iddia eden bu İK ama destek olmadan herhangi bir standart).

Tanımsız davranış mı?

CEVAP
16 AĞUSTOS 2012, PERŞEMBE


Karışıklık C C () böyle bir izin var ise, açıkça bir sendika aracılığıyla type-punning izin verir.

6.5.2.3 Yapısı ve sendika üyeleri

Eğer sendika üyesi bir nesnenin içeriğini okumak için kullanılan üyenin son kullanılan ile aynı İse 95) nesne bir Değer, Değer nesne gösterimi ilgili bölümünü yeniden yorumladı. (bir süreç bazen ‘türü denilen 6.2.6 açıklandığı gibi yeni tür bir nesne temsili olarak ’) punning. Bu tuzak bir temsili olabilir.

C durumu :

9.5 Sendikalar [sınıf.Birliği]

En fazla statik olmayan veri üyeleri herhangi bir zamanda etkin olabilir, birlik, bu değeri. en statik olmayan veri üyeleri herhangi bir zamanda bir birlik içinde saklanabilir.

C dili daha sonra gelinen nokta ilk sıraları structs içeren kullanılmasına olanak vardır; bu ancak type-punning izin vermez.

Union type-punning olup olmadığını belirlemek içinC izin verilen , daha fazla araştırma yapmamız lazım. C 11 için normatif bir referans (ve C99 C11 union type-punning izin benzer bir dil) olduğunu hatırlayalım:

3.9 Tür [temel.tipleri]

4 - T türü bir nesne gösterimi N işaretsiz char nesneleri ele dizisi tarafından tür nesne N boyutu(T) eşittir. Değer temsili bir nesnenin bit ayarlayın. basit copyable türü tür değeri T. tutun, değer gösterimi nesne bit kümesidir bir uygulama tanımlı bir ayrı unsur olan değeri belirler temsil seti değerler.42

Okuduğumuzda özellikle ilginç olur

3.8 Nesne ömür boyu [temel.yaşam]

Türünde bir nesne yaşam süresi T ile başlıyor: — T türü için uygun hizalama ve boyutunu depolama ile elde edilir, ve eğer nesne önemsiz olmayan başlatma, başlatma tamamlandı.

Çok ilkel bir türü olanfilvakibaşlatma önemsiz olan) bulunan bir sendika olarak, nesnenin ömrü, sendikanın en azından ömür boyu kapsar. Bu bizi çağırmak için izin verir

3.9.2 Bileşik türleri [temel.bileşik]

Eğer T türü bir nesne olan bir adres yazın cv bir işaretçi T* bulunuyorsa Bir nesne için bir değer elde edilmiştir nasıl olursa olsun noktasına söyleniyor adresi.

Varsayarak bu işlemi biz ilgilendi. type-punning yani almaya değer bir etkin olmayan sendika üyesi ve verilen başına yukarıdaki elimizde geçerli bir referans nesnesi tarafından belirtilen üye, o operasyon lvalue-rvalue dönüştürme:

4.1 Lvalue-rvalue dönüşüm [dönş.lval]

Non-fonksiyon, dizi olmayan tip T bir glvalue bir prvalue dönüştürülebilir. T tamamlanmamış bir tür ise, bu dönüşüm gerektiren bir program kötü oluşur.Eğer nesneye olan glvalue ifade eder. bir nesnenin türü T ve bir nesne, bir tür türetilmiş T veya nesne başlatılmamış, bir program gerektirir bu dönüşümü olan tanımsız davranış.

O zaman soru şu aktif olmayan bir sendika üyesi olan bir nesne aktif sendika üyesi için depolama tarafından başlatılmış olup olmadığıdır. Söyleyebileceğim kadarıyla, bu durumda ve ancak bu kadar değil:

  • bir Birliği char dizi depolama ve yedekleme (3.9:2) kopyalanır
  • bir sendika bytewise aynı tip (3.9:3) başka bir sendika kopyalanır, ya da
  • bir sendika bir program öğe/IEC 9899 (yani şimdiye kadar olarak tanımlanır) ISO uygun (3.9:4 not 42) tarafından dil sınırlarında, sonra erişilir

etkin olmayan bir üyesi tarafından bir an erişimtanımlanırve nesne ve değer gösterimi takip tanımlanır, yukarıda biri olmadan erişim interpositions tanımsız davranıştır. Bu uygulama elbette tanımsız davranış oluşmaz varsayalım olabilir gibi optimizasyon böyle bir program uygulanmalıdır etkileri bulunmakta.

Bu, meşru olmayan aktif sendika üyesi inşaat olmadan aktif olmayan bir üye atama Tamam neden olan) bir lvalue olabiliriz, ancak başlatılmamış olarak kabul edilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bennythecoder

    Bennythecode

    25 Mart 2008
  • HuskyStarcraft

    HuskyStarcra

    4 HAZİRAN 2009
  • ipsy

    ipsy

    1 EKİM 2012