2017-04-21 17 views
8

Standardın,kayıttan yürütme kuralını UB olduğu konusunda bir gerçeği her zaman biliyordum. Bununla birlikte,Dereference null her zaman UB değil?

(Link 1) der

p = 0; * P; doğal olarak bir hata değildir.

ve

(Link 2) bir bağlantı sağlar lvalue inanıyorum (bir lvalue

dönüştürülür sürece p null olduğunda

* p bir hata olmadığını söylüyor Bu bir yazım hatasıdır ve muhtemelen değerini okumalıdır lvalue, rvalue'a dönüştürülür.)

Bağlantı 1 ayrıca der

char * p = 0; Sadece olarak okuyabilir Char * q = & * (p)

"tanımsız değil" dir, ya da en azından iyi tanımlanmış uygulama tanımlı

bir dil avukat bir sağlayabilir neler olduğuna dair yetkili açıklama?

+0

Ben bir dil avukatı değilim ama bağlantıların okunması, sadece değerinin kullanılmasıyla kendi başına değil, bir boş göstericinin kopyalanmasıdır. Ve evet, bir yazım hatası gibi görünüyor, rıhtım için lvalue olmalıdır, bu şekilde link1'de alıntılanmıştır. Statik üye durumunda, sadece operatörün * statik türünün gerekli olduğunu ve link1'in de görebildiğim kadarıyla tutarlı olduğunu düşünüyorum. – drRobertz

+0

Eğer uygulamalar segfault yaparsa, GERÇEK UB? Bunu düşünemiyorum. – Donnie

cevap

4

this answer'daki boş göstergeler aracılığıyla dolaylılaştırma konusunu araştırdım. Kısacası, söz konusu Çekirdek sorunlarınızda olduğu gibi, gerçekten de iyi tanımlanmış. Komite, yıllar önce önerildiği gibi boş bir lvalue nosyonunu kullanmıştır (fakat asla kabul edilmemiştir); *p böyle boş bir değer olarak kabul edilir ve bu değer (arkasındaki değeri olmayan bir dönüşüm gerçekleştirerek) (varolan olmayan) bellek konumuna erişmeye çalışmadıkça, diğer tüm işlemler beklendiği gibi davranır. Örneğin. p geçersiz ise, &*p, p eşdeğerdir. (Bu aynı zamanda ortak bir deyim olan &arr[n] için gerekli olan bir dizinin sonundaki işaretçiler için de çalışır).

Ayrıca bir paper for empty lvalues taslağı hazırlamaya başladım (bu bir WIP ve N4640'a karşı rebase henüz tamamlanmadı), bu yüzden daha fazlasını bir sonraki aşamada göreceğiz.

İlgili konular