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)

Most upvoted comments

We don’t apologize each time a bug is introduced.