An idea to avoid a narrow class of bugs

bearophile bearophileHUGS at lycos.com
Mon Jun 25 04:35:41 PDT 2012


I've suggested to add a little piece of static analysis inside 
the D compiler, able to catch all cases of a specific kind of 
bugs:

http://d.puremagic.com/issues/show_bug.cgi?id=8293


A short thread in D.learn about a 
core.exception.InvalidMemoryOperationError:
http://forum.dlang.org/thread/js649p$1707$1@digitalmars.com

Caused by this code:

class X {
     string[string] s;
     this() {
         s["s"] = "S";
     }
     ~this() {
         s.remove("s");
     }
}
void main() {
     X x = new X();
}



Jonathan M Davis:

> you should never do anything in a class' destructor/finalizer 
> which could ever trigger the GC in any way.

In past I have seen other similar bugs discussed in D.learn.

I think a small amount of static analysis code added to the D 
front-end can statically avoid every bug of this kind. This code 
has to look inside ~this(){} and work recursively (like purity 
and nothrow enforcement do), searching for functions that perform 
GC activity.

(This is a bit different from the enforcement of the @noheap 
annotation I have suggested in Issue 5219 because it's OK to 
manage C-heap memory inside the destructor, while @noheap looks 
for C-heap activity too (malloc/realloc/calloc)).

Bye,
bearophile


More information about the Digitalmars-d mailing list