Bug 8293 – Small amount of static analysis to avoid certain destructor bugs

Status
RESOLVED
Resolution
MOVED
Severity
enhancement
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2012-06-25T04:34:59Z
Last change time
2022-08-16T11:40:15Z
Assigned to
No Owner
Creator
bearophile_hugs

Comments

Comment #0 by bearophile_hugs — 2012-06-25T04:34:59Z
A short thread in D.learn about a core.exception.InvalidMemoryOperationError: http://forum.dlang.org/thread/[email protected] 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)).
Comment #1 by yebblies — 2013-01-16T18:59:22Z
The problem is that using the gc in a destructor is perfectly valid for two reasons: - InvalidMemoryOperationError is just an implementation deficiency - You can manually call the destructor The first reason will go away eventually.
Comment #2 by Marco.Leise — 2013-06-18T15:27:46Z
(In reply to comment #1) > - You can manually call the destructor Which more or less means that if such an object is allocated with new, there must always be a pointer to it to prevent automatic collection. Because it has to be manually destroyed to be safe. Or can the GC be improved in this regard?
Comment #3 by dlang-bugzilla — 2017-07-02T18:51:39Z
(In reply to Marco Leise from comment #2) > Which more or less means that if such an object is allocated with new, there > must always be a pointer to it to prevent automatic collection. Because it > has to be manually destroyed to be safe. > Or can the GC be improved in this regard? Just use C malloc. This is what RefCounted!T does.
Comment #4 by razvan.nitu1305 — 2022-08-16T11:40:15Z
This should be the job of a third party tool. It's not the compiler's job to check for things like this.