roaring: OR operation results in corrupt bitmaps
Ran into this problem. Seems to be rare and possibly related to range containers? But not sure how to debug it.
func TestCorruption(t *testing.T) {
bm1Raw := "OjAAAAEAAAAAAAoAEAAAANeU2JTZlNqU25TclN2U3pTflOCU4ZQ="
bm2Raw := "OzADAA8AAPT/AQD//wIA//8DAD8NJQAAAC8AAAA1AAAAOwAAAAIAAADWlOKUHWsBAAAA//8BAAAA//8BAAAAPw0="
bm1Decoded, err := base64.StdEncoding.DecodeString(bm1Raw)
require.NoError(t, err)
bm2Decoded, err := base64.StdEncoding.DecodeString(bm2Raw)
require.NoError(t, err)
bm1 := roaring.New()
_, err = bm1.FromBuffer(bm1Decoded)
require.NoError(t, err)
ok, _ := roundTripRoaring("bm1", bm1)
require.True(t, ok)
bm2 := roaring.New()
_, err = bm2.FromBuffer(bm2Decoded)
require.NoError(t, err)
ok, _ = roundTripRoaring("bm2", bm2)
require.True(t, ok)
fmt.Println("bm1", bm1.String())
fmt.Println("bm2", bm1.String())
bm1.Or(bm2)
// Panics.
// fmt.Println("OR output", bm1.String())
ok, _ = roundTripRoaring("output", bm1)
require.True(t, ok) // Fails
}
func roundTripRoaring(name string, b *roaring.Bitmap) (bool, []byte) {
marshaled, err := b.ToBytes()
if err != nil {
return false, nil
}
p, err := roaring.New().FromBuffer(marshaled)
if err != nil {
return false, nil
}
if p != int64(len(marshaled)) {
return false, nil
}
return true, marshaled
}
About this issue
- Original URL
- State: closed
- Created 2 years ago
- Comments: 15 (14 by maintainers)
We don’t apologize each time a bug is introduced.