Skip to content

Commit 635da8d

Browse files
committed
Fix, IntegralSet::contains(other) may give false positive comparing vectors.
1 parent f0b6ce7 commit 635da8d

2 files changed

Lines changed: 43 additions & 9 deletions

File tree

libs/basic/intset.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2726,7 +2726,6 @@ bool IntegralSet<T,A>::Impl::contains(const Node & left, const Node & right) {
27262726
/*bit */{ yes, no, conRSmv, conRVec, conBit, conError },
27272727
/*meta */{ yes, no, conRSmv, conRVec, conError, conMeta },
27282728
};
2729-
assert(!"not tested, contains(const Node&, const Node&)");
27302729
return functs[left.type][right.type](left, right);
27312730
}
27322731

@@ -2751,9 +2750,9 @@ bool IntegralSet<T,A>::Impl::conRArray(
27512750
storage_type ovalue;
27522751

27532752
for (;;) {
2754-
if (!find(&onode, &ovalue, left, *ri))
2753+
if (!find(&onode, &ovalue, left, *ri) || *ri != ovalue)
27552754
return false;
2756-
if (*ri != ovalue || ++ri == re)
2755+
if (++ri == re)
27572756
return true;
27582757
}
27592758
}

tests/intset-t/intset-t.cpp

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ void expect(
5252

5353
//===========================================================================
5454
template <typename T>
55-
static void memleak() {
55+
static void memleakTest() {
5656
int line = 0;
5757
ostringstream os;
5858

@@ -73,7 +73,7 @@ static void memleak() {
7373
// Test combining Node::kVector nodes.
7474
// Use too many values for kSmVector, but not so many it converts to kBitmap.
7575
template <typename T>
76-
static void vectors() {
76+
static void vectorTest() {
7777
int line = 0;
7878
IntegralSet<T> a;
7979
IntegralSet<T> b;
@@ -104,7 +104,41 @@ static void vectors() {
104104

105105
//===========================================================================
106106
template <typename T>
107-
static void test() {
107+
static void containTest() {
108+
int line = 0;
109+
IntegralSet<T> a;
110+
IntegralSet<T> b;
111+
112+
// 2 sm vectors
113+
a.assign("1 2");
114+
b.assign("1 2");
115+
EXPECT(a.contains(b)); // equal lists
116+
b.assign("1");
117+
EXPECT(a.contains(b)); // contained shorter list
118+
b.assign("3");
119+
EXPECT(!a.contains(b)); // shorter list with uncontained values
120+
EXPECT(!b.contains(a)); // shorter list doesn't contain longer
121+
122+
// 2 vectors
123+
a.assign("1 2 4 5 7 8");
124+
b.assign("2 4 8");
125+
EXPECT(a.contains(b));
126+
127+
// 1 sm vec, 1 vec
128+
a.assign("1 2 4 5 7 8");
129+
b.assign("2");
130+
EXPECT(a.contains(b));
131+
b.assign("2 3");
132+
EXPECT(!a.contains(b));
133+
b.assign("4 7");
134+
EXPECT(a.contains(b));
135+
EXPECT(!b.contains(a));
136+
137+
}
138+
139+
//===========================================================================
140+
template <typename T>
141+
static void miscTest() {
108142
int line = 0;
109143

110144
IntegralSet<T> tmp;
@@ -229,9 +263,10 @@ static void test() {
229263
//===========================================================================
230264
template <typename T>
231265
static void allTests() {
232-
memleak<T>();
233-
test<T>();
234-
vectors<T>();
266+
memleakTest<T>();
267+
miscTest<T>();
268+
vectorTest<T>();
269+
containTest<T>();
235270
}
236271

237272
//===========================================================================

0 commit comments

Comments
 (0)