digitalmars.D.bugs - [Issue 1868] New: Interface pointer casts
- d-bugmail puremagic.com (75/75) Feb 25 2008 http://d.puremagic.com/issues/show_bug.cgi?id=1868
- d-bugmail puremagic.com (16/16) Mar 01 2008 http://d.puremagic.com/issues/show_bug.cgi?id=1868
http://d.puremagic.com/issues/show_bug.cgi?id=1868 Summary: Interface pointer casts Product: D Version: 1.027 Platform: PC OS/Version: Linux Status: NEW Severity: normal Priority: P2 Component: DMD AssignedTo: bugzilla digitalmars.com ReportedBy: diggory.hardy gmail.com The following code fails silently in one case and segfaults in another. Presumably it should work, but if not it should probably be reported as an error (the up-cast case can cause hard-to-track bugs). The problem is when casting up/down with interface pointers as commented in the following code. The class-inheritance based version is just there for comparison; it works fine. /// Casting tests. module casts.d; import tango.io.Stdout; interface I { void method(); } class C : I { void method() { Stdout ("C.method").newline; } } class A { void method() { Stdout ("A.method").newline; } } class B : A { void method() { Stdout ("B.method").newline; } } void main () { Stdout ("Interface upcasts:").newline; C c = new C(); Stdout ("To I:").newline; I i = cast(I) c; i.method(); // works as it should Stdout ("To I*:").newline; I* ip = cast(I*) &c; // incorrect? no error/warning even with -w ip.method(); // fails silently Stdout ("Interface downcasts:").newline; I* ip2 = &i; ip2.method(); // works as expected Stdout ("To C:").newline; C c2 = cast(C) (*ip2); c2.method(); // works as expected /+ Compiles fine but segfaults when run: Stdout ("To C*:").newline; C* cp = cast(C*) ip2; Stdout ("cp is null: "~ ((cp is null) ? "true" : "false")).newline; cp.method(); // terminates with SIGSEGV - even though above line says (cp !is null) +/ // The class examples all work with no problems: Stdout ("Class upcasts:").newline; B b = new B(); A a = cast(A) b; A* ap = cast(A*) &b; a.method(); // calls B.method as it should ap.method(); // calls B.method, unlike interface example Stdout ("Class downcasts:").newline; B* bp = cast(B*) ap; bp.method(); // calls B.method, unlike interface example B b2 = cast(B) a; b2.method(); // calls B.method as it should } --
Feb 25 2008
http://d.puremagic.com/issues/show_bug.cgi?id=1868 bugzilla digitalmars.com changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |INVALID All pointer casts do is 'paint' a new type over the old one - no change in the bits ever occurs. To get the correct change in the bits for up/down inheritance casting, you have to cast the actual interface or class (which are reference types). This is working as designed. It's not a bug. You'll see exactly the same behavior in C++ when you do things like: I* i; C** pc = (C**)&i; --
Mar 01 2008