Speaker Rabbit

abbra


CIFS: curious information funneled sometimes


Previous Entry Share Next Entry
Клеймо на всю жизнь
Speaker Rabbit
abbra
Не хотите больше быть программистом? Оставьте свой след в истории:
http://blog.8thlight.com/dariusz-pasciak/2012/07/03/dereferencing-null-pointer-without-a-seg-fault.html

После того, как прочитали, заходите под кат и ответьте на вопрос: Скажите, а вас учили, что оператор -> над классами в C++ эквивалентен разыменованию указателя в C?

Что интересно, в стандарте С++ в 5.2.5 (Class member access) в третьем абзаце написано:
If E1 has the type “pointer to class X,” then the expression E1->E2 is converted to the equivalent form (*(E1)).E2; the remainder of 5.2.5 will address only the first option (dot).

Правда, 13.5.6 (Class member access) говорит уже более аккуратно об этом:
An expression x->m is interpreted as (x.operator->())->m for a class object x of type T if T::operator->() exists and if the operator is selected as the best match function by the overload resolution mechanism (13.3)


  • 1
Леша, заметь, это еще не пятница!

Я в свое время на похожее поведение уже натыкался.

http://beldmit.livejournal.com/51712.html?nc=6#comments

Оптимизация - страшная вещь.

Тут вопрос совсем не оптимизации, а того, что человек на голубом глазу не осознает разницы между языками.

А не (x.operator->()).m?

Это если этот оператор есть, о чём сообщает вторая цитата из стандарта. А если нету — просто разыменовать. А если метод не виртуальный (статическая линковка), то this не нужен. А если в методе нет обращения к виртуальным методам или не-статическим полям, то this по-прежнему не нужен и может быть любым мусором, в том числе и NULL. Всё логично, на самом деле.

Хм... Очередная ЕЖУПА. В смысле, то, что можно разыменовывать так NULL до тех пор пока в методе нет обращения (прямого или косвенного) к this я знаю не помню сколько лет...

Конечно. Вопрос же не в этом, а в том, что человек расписывается в незнании этого момента огромной статьей, в которой еще и делает неправильные выводы из неправильных посылок, тем самым позволяя потенциальным работодателям отлично послать его подальше без интервью.

(Deleted comment)
this будет 0, и всё. IIRC.

Ну да. Для продвинуых x86-программеров, ECX=0 на входе в функцию член класса.

Вот этот тоже хорош http://blog.8thlight.com/kevin-liddle/2012/05/22/be-a-relentless-programmer.html --- он "learned thought patterns", извиняюсь за выражение. Ну в общем не удивительно с такой-то страничкой http://www.8thlight.com/careers

:) через паттерн Пальцеметра

(Deleted comment)
(Deleted comment)
Дети, ну чисто дети. И на таком ацком серьезе обьясняют, много буков, коровы, ошейники, все дела...

Ему бы за студентами ошибки в большом проекте поискать - так он бы там и не такое нашел. Правда написать об этом 5 страниц без единого матерного слова не смог бы.

к студентам не пущать

он же сколько невинных душ искалечит.

Вызов невиртуального метода происходит, грубо говоря, по заранее известному адресу, только неявно передается первый аргумент this=NULL. В этом же примере, если "void milk()" заменить на "virtual void milk()", то будет segmentation fault, поскольку вызов метода через VMT пойдет через нулевой указатель. Цитирование стандартов - это немного буквоедство, надо просто представлять, как эта дрянь работает. :-)

Конечно. Что касается стандарта, то там, как видишь, тоже не совсем чисто.

  • 1
?

Log in

No account? Create an account