From a666d180ecbe2327e6f59f8fbd89ef8b3c26200d Mon Sep 17 00:00:00 2001 From: bloeys Date: Sun, 21 Jul 2024 23:40:06 +0400 Subject: [PATCH] Bug in IsEq --- nset.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/nset.go b/nset.go index 86ed5b4..430b753 100644 --- a/nset.go +++ b/nset.go @@ -289,10 +289,13 @@ func (n *NSet[T]) IsEq(otherSet *NSet[T]) bool { b1 := &n.Buckets[i] b2 := &otherSet.Buckets[i] - bucketsEqual := (b1.StorageUnitCount == 0 && b2.StorageUnitCount == 0) || bytes.Equal( - unsafe.Slice((*byte)(unsafe.Pointer(&b1.Data[0])), len(b1.Data)*int(unsafe.Sizeof(b1.Data[0]))), - unsafe.Slice((*byte)(unsafe.Pointer(&b2.Data[0])), len(b2.Data)*int(unsafe.Sizeof(b2.Data[0]))), - ) + // The .Data[0] will panic if either unit count is zero, so these checks + // both avoid that panic and provide an early exit + bucketsEqual := (b1.StorageUnitCount == 0 && b2.StorageUnitCount == 0) || + (b1.StorageUnitCount == b2.StorageUnitCount && bytes.Equal( + unsafe.Slice((*byte)(unsafe.Pointer(&b1.Data[0])), len(b1.Data)*int(unsafe.Sizeof(b1.Data[0]))), + unsafe.Slice((*byte)(unsafe.Pointer(&b2.Data[0])), len(b2.Data)*int(unsafe.Sizeof(b2.Data[0]))), + )) if !bucketsEqual { return false