Skip to content

Commit 961d6eb

Browse files
authored
[MOD-11651] Fix wrong template type deduction in GenerateAndAddVector (#785)
Prevent template deduction errors in GenerateAndAddVector by making data_t parameter non-deducible Used std::type_identity<data_t>::type for the value parameter to force explicit template specification (e.g., GenerateAndAddVector<double>()) instead of allowing compiler to incorrectly deduce int from literal values, which caused buffer overflows when index expected different data types.
1 parent f68bb6b commit 961d6eb

File tree

4 files changed

+13
-11
lines changed

4 files changed

+13
-11
lines changed

tests/unit/test_bruteforce_multi.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1280,7 +1280,7 @@ TYPED_TEST(BruteForceMultiTest, rangeQuery) {
12801280
GenerateAndAddVector<TEST_DATA_T>(index, dim, i, i);
12811281
// Add some vectors, worst than the second loop (for the given query)
12821282
for (size_t j = 0; j < per_label - 1; j++)
1283-
GenerateAndAddVector(index, dim, i, (TEST_DATA_T)i + n);
1283+
GenerateAndAddVector<TEST_DATA_T>(index, dim, i, (TEST_DATA_T)i + n);
12841284
}
12851285

12861286
ASSERT_EQ(VecSimIndex_IndexSize(index), n);

tests/unit/test_hnsw_tiered.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,7 +1092,7 @@ TYPED_TEST(HNSWTieredIndexTest, deleteFromHNSWWithRepairJobExec) {
10921092
auto allocator = tiered_index->getAllocator();
10931093

10941094
for (size_t i = 0; i < n; i++) {
1095-
GenerateAndAddVector(tiered_index->getHNSWIndex(), dim, i, i);
1095+
GenerateAndAddVector<TEST_DATA_T>(tiered_index->getHNSWIndex(), dim, i, i);
10961096
}
10971097

10981098
// Delete vectors one by one and run the resulted repair jobs.
@@ -2772,7 +2772,7 @@ TYPED_TEST(HNSWTieredIndexTest, testInfo) {
27722772
ASSERT_EQ(info.commonInfo.basicInfo.type, s_info.type);
27732773
ASSERT_EQ(info.commonInfo.basicInfo.isTiered, s_info.isTiered);
27742774

2775-
GenerateAndAddVector(tiered_index, dim, 1, 1);
2775+
GenerateAndAddVector<TEST_DATA_T>(tiered_index, dim, 1, 1);
27762776
info = tiered_index->debugInfo();
27772777
stats = tiered_index->statisticInfo();
27782778

@@ -2805,7 +2805,7 @@ TYPED_TEST(HNSWTieredIndexTest, testInfo) {
28052805
EXPECT_EQ(info.tieredInfo.backgroundIndexing, false);
28062806

28072807
if (TypeParam::isMulti()) {
2808-
GenerateAndAddVector(tiered_index, dim, 1, 1);
2808+
GenerateAndAddVector<TEST_DATA_T>(tiered_index, dim, 1, 1);
28092809
info = tiered_index->debugInfo();
28102810
stats = tiered_index->statisticInfo();
28112811

@@ -2854,7 +2854,7 @@ TYPED_TEST(HNSWTieredIndexTest, testInfoIterator) {
28542854
auto *tiered_index = this->CreateTieredHNSWIndex(hnsw_params, mock_thread_pool, 1);
28552855
auto allocator = tiered_index->getAllocator();
28562856

2857-
GenerateAndAddVector(tiered_index, dim, 1, 1);
2857+
GenerateAndAddVector<TEST_DATA_T>(tiered_index, dim, 1, 1);
28582858
VecSimIndexDebugInfo info = tiered_index->debugInfo();
28592859
VecSimIndexDebugInfo frontendIndexInfo = tiered_index->frontendIndex->debugInfo();
28602860
VecSimIndexDebugInfo backendIndexInfo = tiered_index->backendIndex->debugInfo();
@@ -2877,7 +2877,7 @@ TYPED_TEST(HNSWTieredIndexTest, debugInfoIteratorFieldOrder) {
28772877
.multi = TypeParam::isMulti()};
28782878
auto mock_thread_pool = tieredIndexMock();
28792879
auto index = test_utils::CreateNewTieredVecSimIndex(hnsw_params, mock_thread_pool);
2880-
GenerateAndAddVector(index, dim, 1, 1);
2880+
GenerateAndAddVector<TEST_DATA_T>(index, dim, 1, 1);
28812881
VecSimDebugInfoIterator *infoIterator = VecSimIndex_DebugInfoIterator(index);
28822882

28832883
// Test the field order using the common function

tests/unit/test_svs_tiered.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2402,7 +2402,7 @@ TYPED_TEST(SVSTieredIndexTest, testInfo) {
24022402
ASSERT_EQ(info.commonInfo.basicInfo.type, s_info.type);
24032403
ASSERT_EQ(info.commonInfo.basicInfo.isTiered, s_info.isTiered);
24042404

2405-
GenerateAndAddVector(tiered_index, dim, 1, 1);
2405+
GenerateAndAddVector<TEST_DATA_T>(tiered_index, dim, 1, 1);
24062406
info = tiered_index->debugInfo();
24072407

24082408
EXPECT_EQ(info.commonInfo.indexSize, 1);
@@ -2432,7 +2432,7 @@ TYPED_TEST(SVSTieredIndexTest, testInfo) {
24322432
EXPECT_EQ(info.tieredInfo.backgroundIndexing, false);
24332433

24342434
if (TypeParam::isMulti()) {
2435-
GenerateAndAddVector(tiered_index, dim, 1, 1);
2435+
GenerateAndAddVector<TEST_DATA_T>(tiered_index, dim, 1, 1);
24362436
info = tiered_index->debugInfo();
24372437

24382438
EXPECT_EQ(info.commonInfo.indexSize, 2);
@@ -2478,7 +2478,7 @@ TYPED_TEST(SVSTieredIndexTest, testInfoIterator) {
24782478
ASSERT_INDEX(tiered_index);
24792479
auto allocator = tiered_index->getAllocator();
24802480

2481-
GenerateAndAddVector(tiered_index, dim, 1, 1);
2481+
GenerateAndAddVector<TEST_DATA_T>(tiered_index, dim, 1, 1);
24822482
VecSimIndexDebugInfo info = tiered_index->debugInfo();
24832483
VecSimIndexDebugInfo frontendIndexInfo = tiered_index->GetFlatIndex()->debugInfo();
24842484
VecSimIndexDebugInfo backendIndexInfo = tiered_index->GetBackendIndex()->debugInfo();
@@ -2503,7 +2503,7 @@ TYPED_TEST(SVSTieredIndexTest, debugInfoIteratorFieldOrder) {
25032503
auto *index = test_utils::CreateNewTieredVecSimIndex(params, mock_thread_pool);
25042504
ASSERT_INDEX(index);
25052505

2506-
GenerateAndAddVector(index, dim, 1, 1);
2506+
GenerateAndAddVector<TEST_DATA_T>(index, dim, 1, 1);
25072507
VecSimDebugInfoIterator *infoIterator = VecSimIndex_DebugInfoIterator(index);
25082508

25092509
// Test the field order using the common function

tests/unit/unit_test_utils.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,10 @@ static void GenerateVector(data_t *output, size_t dim, data_t value = 1.0) {
6262
}
6363
}
6464

65+
// use std::type_identity to force explicit template specification.
6566
template <typename data_t>
66-
int GenerateAndAddVector(VecSimIndex *index, size_t dim, size_t id, data_t value = 1.0) {
67+
int GenerateAndAddVector(VecSimIndex *index, size_t dim, size_t id,
68+
typename std::type_identity<data_t>::type value = 1.0) {
6769
data_t v[dim];
6870
GenerateVector(v, dim, value);
6971
return VecSimIndex_AddVector(index, v, id);

0 commit comments

Comments
 (0)