[ntcore] Fix undefined comparison behavior when array is empty (#5448)

If both arrays are empty, it returns true, avoiding UB with memcmp potentially getting a nullptr.
This commit is contained in:
Gold856
2023-07-17 20:16:54 -04:00
committed by GitHub
parent 17eb9161cd
commit 1f6428ab63
2 changed files with 79 additions and 0 deletions

View File

@@ -336,6 +336,58 @@ TEST_F(ValueTest, BooleanArrayComparison) {
vec = {1, 0};
v2 = Value::MakeBooleanArray(vec);
ASSERT_NE(v1, v2);
// empty
vec = {};
v1 = Value::MakeBooleanArray(vec);
v2 = Value::MakeBooleanArray(vec);
ASSERT_EQ(v1, v2);
}
TEST_F(ValueTest, IntegerArrayComparison) {
std::vector<int64_t> vec{-42, 0, 1};
auto v1 = Value::MakeIntegerArray(vec);
auto v2 = Value::MakeIntegerArray(vec);
ASSERT_EQ(v1, v2);
// different contents
vec = {-42, 1, 1};
v2 = Value::MakeIntegerArray(vec);
ASSERT_NE(v1, v2);
// different size
vec = {-42, 0};
v2 = Value::MakeIntegerArray(vec);
ASSERT_NE(v1, v2);
// empty
vec = {};
v1 = Value::MakeIntegerArray(vec);
v2 = Value::MakeIntegerArray(vec);
ASSERT_EQ(v1, v2);
}
TEST_F(ValueTest, FloatArrayComparison) {
std::vector<float> vec{0.5, 0.25, 0.5};
auto v1 = Value::MakeFloatArray(vec);
auto v2 = Value::MakeFloatArray(vec);
ASSERT_EQ(v1, v2);
// different contents
vec = {0.5, 0.5, 0.5};
v2 = Value::MakeFloatArray(vec);
ASSERT_NE(v1, v2);
// different size
vec = {0.5, 0.25};
v2 = Value::MakeFloatArray(vec);
ASSERT_NE(v1, v2);
// empty
vec = {};
v1 = Value::MakeFloatArray(vec);
v2 = Value::MakeFloatArray(vec);
ASSERT_EQ(v1, v2);
}
TEST_F(ValueTest, DoubleArrayComparison) {
@@ -353,6 +405,12 @@ TEST_F(ValueTest, DoubleArrayComparison) {
vec = {0.5, 0.25};
v2 = Value::MakeDoubleArray(vec);
ASSERT_NE(v1, v2);
// empty
vec = {};
v1 = Value::MakeDoubleArray(vec);
v2 = Value::MakeDoubleArray(vec);
ASSERT_EQ(v1, v2);
}
TEST_F(ValueTest, StringArrayComparison) {
@@ -390,6 +448,12 @@ TEST_F(ValueTest, StringArrayComparison) {
vec.push_back("goodbye");
v2 = Value::MakeStringArray(std::move(vec));
ASSERT_NE(v1, v2);
// empty
vec.clear();
v1 = Value::MakeStringArray(vec);
v2 = Value::MakeStringArray(std::move(vec));
ASSERT_EQ(v1, v2);
}
} // namespace nt