2017-04-21 42 views
8

Zawsze wiedziałem, że Standard nakazuje dereferencję null jest UB. JednakUsunięcie wartości zerowej nie zawsze jest UB?

(Link 1) mówi

p = 0; * p; nie jest z natury błędem.

i zawiera link do

(Link 2) mówi

* p nie jest błędem, gdy p jest nieważna, chyba że lwartość przekształca się lwartością

(wierzę to jest literówka i prawdopodobnie powinien przeczytać lwartość jest konwertowana na wartość rvalue)

Link 1 mówi również

char * p = 0; char * q = & * (p)

nie jest „nieokreślone”, który mogę tylko czytać jako dobrze zdefiniowane lub przynajmniej wdrożenie zdefiniowane

Czy prawnik język zapewniają szybkość rozpuszczania autorytatywne wyjaśnienie tego, co się dzieje?

+0

Nie jestem adwokatem językowym, ale moje czytanie linków jest takie, że wyłuskiwanie zerowego wskaźnika nie jest samo w sobie UB, tylko przy użyciu wartości jest. I tak, wydaje się to literówką, powinno być lwartością do rwartości, ponieważ tak jest cytowane w linku1. Myślę, że ma to sens w przypadku elementu statycznego, ponieważ potrzebny jest tylko statyczny typ 'operator *', a link1 jest, o ile widzę, zgodny z tym. – drRobertz

+0

Jeśli implementacje sprawiają, że jest to segfault, czy to NAPRAWDĘ UB? Nie mogę o tym myśleć. – Donnie

Odpowiedz

4

Zbadałem temat pośredni poprzez wskaźniki zerowe w this answer. Krótko mówiąc, jest to rzeczywiście dobrze zdefiniowane per se, tak jak zostało to wyjaśnione w cytowanych zagadnieniach Core. Komitet użył pojęcia pustej l-wartości zaproponowanej wiele lat temu (ale nigdy nie przyjętej); *p ma być taką pustą lwartością, i chyba że spróbujemy uzyskać dostęp do (nieistniejącej) lokalizacji pamięci znajdującej się za tą lwartością (na przykład, wykonując konwersję wartości do wartości r), wszystkie inne operacje zachowują się zgodnie z oczekiwaniami. Na przykład. &*p jest odpowiednikiem p, chyba że p jest nieprawidłowy. (Działa to również dla wskaźników poza końcem tablicy, która jest niezbędna dla wspólnego idiomu &arr[n]).

Zacząłem też opracowywać paper for empty lvalues (to jest WIP, a rebase na N4640 jeszcze nie jest kompletny), więc jest szansa, że ​​zobaczymy więcej tego na późniejszym etapie.