[bitc-dev] Capture problem with by-ref

David-Sarah Hopwood david.hopwood at industrial-designers.co.uk
Wed Mar 12 22:11:08 EDT 2008

Jonathan S. Shapiro wrote:
> On Wed, 2008-03-12 at 18:03 +0000, Sam Mason wrote:
>> OK, I didn't realise it was doing this.  It'll be fun/awkward writing
>> code that doesn't do any heapification then :) 
> We have in mind to build an audit tool for this, so that code can be
> annotated as "should not allocate" and a checker can test this.
>> I've also just thought of
>> another issue with mutable by-refs, I think it's going to make auditing
>> harder?  Take the following function:
>>   (defun (f x : (mutable int32))
>>     (g x)
>>     x)
> Yes, there is definitely an auditing issue here. That is a real concern,
> and an important one.
> So let's look at that, and look at the alternatives.
> First, note that the issue only arises for (by-ref (mutable T)). If the
> reference type is immutable, no audit issue arises.
> The problem with *removing* BY-REF is that we have many cases in
> practice where we have some very large structure and we need to
> initialize or update some part of it. For example, in the Coyotos kernel
> we have lots of structures that contain capabilities, and we "prepare"
> these frequently. Our options are:
>    capSlot := prepare(capSlot)	; pass by copy
> or
>    prepare(capSlot);  pass by mutable reference
> Unfortunately, the performance advantages of the second are quite
> overwhelming. This seems to be a case where there is an unavoidable
> tradeoff between performance and audit, and in this case I think the
> argument in favor of performance is quite strong.

A linear type system is potentially capable of ensuring that a mutable
reference can be passed into prepare(...), but that no aliases derived
from that reference remain after prepare has returned.

Of course this could be considered a rather complicated sledgehammer,
but I'm trying to get a handle on precisely which problem(s) you are
concerned about with respect to auditability -- is it the potential
for aliasing of a reference after the procedure to which it was passed
has returned?

David-Sarah Hopwood

More information about the bitc-dev mailing list