SORU
1 Mayıs 2014, PERŞEMBE


C standart C 14 değerleri belirsiz ve tanımsız davranış kullanımı açısından değişti?

Does initialization entail lvalue-to-rvalue conversion? Is int x = x; UB? kaplı olarak C standart 3.3.2 bölümünde şaşırtıcı bir örnek vardırBildirgeye noktasıbir int kendi belirsiz değeri ile başlatıldı:

int x = 12;
{ int x = x; }

Burada ikinci x (belirsiz) kendi değeri ile başlatıldı. —son örnek]

Bu soruya cevap veren lvalue-rvalue bir dönüşüm gerektirir beri tanımsız davranış olduğunu gösterir.

C 14 son taslak standart here Bu örnek bulunabilir N3936 değişti:

unsigned char x = 12;
{ unsigned char x = x; }

Burada ikinci x (belirsiz) kendi değeri ile başlatıldı. —son örnek]

Bir şey C 14 değişti örnekte bu değişim odaklı olan değerleri belirsiz ve tanımsız davranış açısından?

CEVAP
1 Mayıs 2014, PERŞEMBE


Evet, bu değişim tanımsız davranış yapar dilinde değişiklikler sürüldüeğer belirsiz bir değer, bir değerlendirme tarafından üretilirama bazı istisnalar dışındaimzasız dar karakterler.

N3914 bulunabilir olan Defect report 17871recently accepted in 2014 ve son taslak çalışma dahil oldu N3936:

Belirsiz değerleri açısından en ilginç değişiklik 8.5 paragraf bölümünde olurdu12gelen giden:

Eğer başlatıcı bir nesne için belirtilen nesne varsayılan başlatıldı; eğer başlatma işlemi, otomatik veya dinamik depolama süresi ile bir nesne belirsiz bir değeri var. [Not:Statik veya iplik depolama süresi ile nesneleri sıfır-başlatıldı, 3.6.2. —not end]

(vurgu benim):

Eğer başlatıcı bir nesne için belirtilen nesne varsayılan başlatıldı. Bir depolama otomatik veya nesne dinamik depolama süresi elde edilir, bir nesne vardırbelirsiz değerve eğer hayır başlatma nesne için, bu gerçekleştirilirse nesne değeri değiştirilene kadar belirsiz bir değeri korur (5.17 [ifade.kıçını]). [Not: statik ya da iş parçacığı depolama ile Nesneleri süresi sıfır başlatılır, bakın 3.6.2 [temel.başlayın.ınit]. —son not]Eğer belirsiz bir değer, bir değerlendirme, tarafından üretilen davranış, aşağıdaki durumlar dışında tanımsızdır:

  • İmzasız dar karakter türü belirsiz bir değeri varsa (3.9.1 [temel.temel]) değerlendirilmesi ile oluşturulur:

    • koşullu bir ifade ikinci veya üçüncü işlenen (5.16 [ifade.cond]),

    • virgül sağ işleneni (5.18 [ifade.virgül]),

    • imzasız dar karakteri bir tür atama veya dönüştürme işlenen (4.7 [dönş.integral], 5.2.3 [ifade.yazın.dönş], 5.2.9 [ifade.statik.cast], 5.4 [ifade.cast]), ya da

    • bir değer atılır ifade (Madde 5 [ifade]),

    daha sonra işlem sonucu belirsiz bir değerdir.

  • İmzasız dar karakter türü belirsiz bir değeri varsa (3.9.1 [temel.temel]) bu doğru değerlendirilmesi tarafından üretilen basit atama operatörü işleneni (5.17 [ifade.kıçını]) olan ilk işlenen imzasız dar karakter tipi, bir lvalue belirsiz değer nesnenin bir değeri belirtilen değiştirir sol işlenen.

  • İmzasız dar karakter türü belirsiz bir değeri varsa (3.9.1 [temel.temel]) değerlendirilmesi tarafından üretilen başlatma imzasız bir nesne başlatırken ifade bir belirsiz nesne başlatıldı dar karakteri yazın değer.

ve aşağıdaki örnek dahil:

[Örnek:

int f(bool b) {
  unsigned char c;
  unsigned char d = c; // OK, d has an indeterminate value
  int e = d;           // undefined behavior
  return b ? d : 0;    // undefined behavior if b is true
}

son örnek]

working draft N3937 C 14 DIS geçerli olan N3936 Bu metin bulabiliriz.

C 1y önce

C aksine bu taslak önce which has always had a well specified notion of what uses of indeterminate values were undefined C bile tanımlamadan belirsiz süreli değeri kullanılan ilgi çekicidir (assuming we can not borrow definition from C99ve aynı zamanda see defect report 616. draft C 11 standard bölümünde 4.1 kaplı underspecified lvalue-to-rvalue conversion güvenmek zorundaydıkLvalue-rvalue dönüşümparagraf1diyor ki:

eğer nesne başlatılmamış ise [...], bu dönüşüm gerektiren bir program tanımsız davranış var.[...]


Dipnot:

  1. 1787 defect report 616, N3903 bu bilgileri bulabileceğimiz bir revizyon

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DudeFromUkraine

    DudeFromUkra

    7 Ocak 2008
  • NextKsa

    NextKsa

    7 EKİM 2009
  • Rickymon Tero

    Rickymon Ter

    1 Ocak 2007