Invalidation of bitmap iterator by clearing bits - Intentional or not?
Daniel Berlin
dberlin@dberlin.org
Tue Oct 26 19:06:00 GMT 2004
Recently, I tracked down a bug in somebody else's code to the fact that
clearing bits in a bitmap you are iterating over can fail miserably in
some cases, and this is not documented anywhere. In particular, the
following loop:
EXECUTE_IF_SET_IN_BITMAP (bitmap, 0, i, bi)
{
bitmap_clear_bit (bitmap, i);
}
will stop after going through the first element with bits set,
regardless of whether there are other elements with bits set or not.
What happens is that when you clear the last set bit in the element, it
frees the element (which the iterator still has a pointer to), and
places it on the free list.
There are two possibilities as to what the iterator does at this point:
1. If the bitmap element was the only bitmap on the free list, we stop
iterating, even though there are more set bits in the bitmap.
2. If the bitmap element wasn't the only bitmap on the free list, we
cutely start iterating over the elements in the freelist (since that is
where our bitmap element's next pointer now points, to the next element
on the free list).
Neither of these are good failure modes for catching this undocumented
behavior.
This raises the question of whether this undocumented behavior is
intentional or not.
If so, should i make it so the iterator aborts when it starts iterating
over an element that is now in the free list (by adding a flag to the
element structure saying it's free when ENABLE_CHECKING is on, and
checking that flag)?
Or should we just document it in bitmap.h and hope nobody hits this
problem accidently?
--Dan
More information about the Gcc
mailing list