Skip to content

Nonmoving GC may drop update remembered set blocks due to `setNumCapabilities`

Storage.c:storageAddCapabilities currently has the following:

    // Initialize NonmovingAllocators and UpdRemSets
    if (RtsFlags.GcFlags.useNonmoving) {
        nonmovingAddCapabilities(to);
        for (i = 0; i < to; ++i) {
            nonmovingInitUpdRemSet(&getCapability(i)->upd_rem_set);
        }
    }

This is subtly wrong: the lower iteration bound of 0 means we end up re-initializing (and therefore clearing) the update-remembered sets of capabilities which already exist. This lower bound rather should be from.

This can result in undefined behavior in programs using the nonmoving GC and setNumCapabilities.

Edited by Ben Gamari
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information