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?
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
Jeśli implementacje sprawiają, że jest to segfault, czy to NAPRAWDĘ UB? Nie mogę o tym myśleć. – Donnie