Hijacking

Chris Nicholson-Sauls ibisbasenji at gmail.com
Sun Aug 5 11:57:16 PDT 2007


Walter Bright wrote:
> I want to continue a bit in the Overloading/Inheritance thread which is 
> getting a little long, on a closely related issue which I find to be 
> important, but so rarely referred to that I had to come up with a name 
> for it - hijacking.
> 
> Hijacking is when code A depends on B, and then when seemingly unrelated 
> code C is modified, then A's behavior silently changes. Here's an 
> example from C++:
> 
> --A.h--
> void foo(long i);
> 
> --B.c--
> #include "A.h"
> #include "C.h"
> ...
> foo(3);    // calls A's foo(long)
> --------
> 
> Let's say A.h and C.h are developed by different people. In C.h, the 
> developer adds:
> 
> --C.h--
> void foo(int i);
> -----
> 
> This does something completely different from A.h's foo(long), because 
> they just happened to share the same name. Now, when B.c is recompiled, 
> it's call to foo is silently *hijacked* by C.h's foo.
> 
> Because of C++'s overloading rules and lack of modularity, there's no 
> way to programmatically defend against this. Instead, one has to rely on 
> coding conventions (such as using a unique package prefix name on all 
> symbols, like A_foo() and C_foo()).

Thank the heavens for D's modules and FQN's.  :)  You've got that 
situation covered.

> So how does this relate to the overloading/inheritance issues? Consider:
> 
> ----A.d----
> class A
> {
>     ...
> }
> -----B.d----
> import A;
> class B : A
> {
>     void foo(long);
> }
> ...
> void bar(B b)
> {
>     b.foo(3);   // calls B.foo(long)
> }
> ----
> 
> Let's say A.d comes from some third party library. Now the developer of 
> A decides to add some functionality to class A, and adds the member 
> function foo(int):
> 
> ----A.d---
> class A
> {
>     void foo(int);
> }
> ------------
> 
> Now our hapless B programmer has his calls to B.foo(long) silently 
> hijacked to A.foo(int) (under Java rules). I don't see any reasonable 
> way for B to defend against this. Certainly, developer A doesn't have 
> any idea who is deriving from A (and that's the point of polymorphism) - 
> but should he be disallowed from adding *any* method names? And the 
> hapless B developer, he wrote class B years ago and no longer quite 
> remembers how it works, he just recompiles it and now it silently fails.
> 
> So, this is one case where I feel C++ got it right, and Java didn't.
> 
> (P.S. It's not a compiler implementation issue, nor is it a runtime 
> performance issue.)

Alright.  I can't argue against that one little bit.  I will mention for 
completeness the option of using an L suffix to explicitly state you 
want a long... but then there's no analog for explicit int/short/byte, 
so the problem still exists in any case other than ambiguity against 
long.  (Yes there's cast()... but ew.)

-- Chris Nicholson-Sauls



More information about the Digitalmars-d mailing list