Am 27.07.2018 um 19:41 schrieb Ryan Joseph:
On Jul 27, 2018, at 11:24 AM, Mattias Gaertner <nc-gaert...@netcologne.de>
wrote:
You can't if you compile with -CR.
The RTL is not compiled with objectchecks, so it works there.
According to this test not only can you call methods on nil objects but
it calls the method statically (like a class method), i.e the test
prints “DoThis”. How is that possible?
Self on x86_64 target is just a hidden argument.
It won't work with virtual methods.
This is all news to me. I had no idea I was possibly compiling programs where I
could call nil objects.
Normal, non-virtual methods are essentially ordinary
functions/procedures. In contrast to static functions/procedures they
have a hidden parameter that contains the value of Self. As Self is
merely a pointer there is no problem if Self should be Nil as long as it
isn't dereferenced (which happens if you access a field or a call a
virtual method).
Calling a virtual method would fail immediately.
How do I disable this? I just ran this test program with -CR and I still calls
the method statically.
The method is always called statically, -CR doesn't change anything
there. Calling a virtual method however would fail with EObjectCheck
instead of EAccessViolation.
The method you provided below would not fail anyway, because it doesn't
dereference Self. If you'd however access for example a field of your
class then a check should be inserted inside the method. For some reason
it isn't however and *that* is the bug.
Regards,
Sven
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal