great progress on dive site handling

Thiago Macieira thiago at macieira.org
Mon Jun 29 11:23:14 PDT 2015


On Monday 29 June 2015 11:07:08 Dirk Hohndel wrote:
> Thanks Thiago for taking a look. It confused me that this would thrown a
> SIGSEGV in the pixel() function and not when dereferencing m_title to get
> to the pixel member function...

It wouldn't because pixel() is not a virtual function.

A non-virtual member function is just a regular function, called by name, 
which takes an implicit first parameter that is the object in question.

For 
	struct Foo { void f(); };
	Foo *foo;

The code
	foo->f();

is equivalent to
	_ZN3Foo1fEv(foo);

There's no pointer dereferencing before the actual call is placed, which is 
why it only crashed inside the function, not before it.

To be clear, it's undefined behaviour to do the above on foo = NULL. But UB can 
take many forms, including "working as expected".

There's some on-going discussion in the C++ standards group to allow the code

	f->foo();

to find a free function foo(Foo*) and call that. It's called "Unified call 
syntax" [1] and I actually triggered that discussion about a year and a half 
ago after seeing Linus rant here about some quirk of C++ :-)

[1] http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4474.pdf
-- 
Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
   Software Architect - Intel Open Source Technology Center
      PGP/GPG: 0x6EF45358; fingerprint:
      E067 918B B660 DBD1 105C  966C 33F5 F005 6EF4 5358



More information about the subsurface mailing list