Conservative GC is quite vicious against the use of lazy lists:
You have code like this:
function(make_infinite_lazy_list());
where function walks down the list: fun function(list)
{
while (list) { // nil is false
...
list = cdr(list);
}
}
problem is, the parent stack frame contains a spurious copy of the original return value from make_infinite_lazy_list, and so as function marches down the list, the discard prefix of the list is not becoming garbage, as expected.This is the showstopper for conservative GC. Not the bogeyman of a stray machine integer suddenly looking exactly like a heap pointer.
Stick a conservative scanner under C, make yourself some lazy lists, and this problem will easily reproduce!