There are still a few cases to worry about. For example, during function activation: if you allocate anything between the time you switched to a new lexical scope, but before saving the old one somewhere in the root set you are in trouble. This is easy to do, because you want to just save it in a local C variable until you have allocated the thing where you are ultimately going to save it.
https://github.com/jhallen/ivy-lang
In general gc bugs (like all allocation related bugs) are a nightmare because the effect is always delayed from the bug.