DIP74: Reference Counted Class Objects

H. S. Teoh via Digitalmars-d digitalmars-d at puremagic.com
Fri Feb 27 07:42:41 PST 2015


On Thu, Feb 26, 2015 at 11:35:55PM -0800, Walter Bright via Digitalmars-d wrote:
> On 2/26/2015 5:37 PM, H. S. Teoh via Digitalmars-d wrote:
> >Wait, are you saying that forgetting the 'return' annotation will
> >still compile without any warning?? Wow, that's ... not nice. :-(
> 
> Indeed, and the compiler will error out if you try that:
> 
> ---
> struct S {
>     int x;
> }
> 
> ref int foo(ref S s) {
>     return s.x;
> }
> ---
> 
> dmd -c foo -dip25
> foo.d(7): Error: escaping reference to local ref variable s
> 
> There'd be no point to DIP25 if it didn't.

Huh? We weren't talking about that -- it's already a given that this
case works, otherwise DIP25 would truly have no point.

The problematic case comes from the manually-managed array member that
you can freely return, yet it may become a dangling reference once
opRelease deallocates it:

	class S {
		int[] data;
		int[] foo() { return data; } // <-- happily compiles
		void opAddRef() { ... }
		void opRelease() {
			...
			GC.free(data); // <-- uh oh
		}
	}

	int[] fun() {
		S s = /* create instance of S */
		return s.foo();
		// s goes out of scope here, and opRelease() cleans up
		// but we now have an escaping reference to s.data
	}

	void main() {
		int[] dangling = fun();
		dangling[0] = 1;	// kaboom
	}


S.foo() should have been annotated with 'return', but the programmer
forgot and the compiler still accepts the code without any warnings,
thereby violating @safe.


T

-- 
Bomb technician: If I'm running, try to keep up.


More information about the Digitalmars-d mailing list