Skip to content

Commit aeeb15a

Browse files
committed
FIX: RKNN undefined return values in certain conditions.
1 parent 513bf22 commit aeeb15a

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

doc/source/doxygen-docs/changelog.md

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
- Fix tons of typos and Debian-specific spare install files (lintian --pedantic).
1212
- Fix segfault in arm64 EKF unit tests.
1313
- Fix bug in mrpt::system::CDirectoryExplorer: it would throw and stop if finds a broken symlink.
14+
- Fix regression in mrpt::math::KDTreeCapable: all RKNN calls (NN with maximum radius) may return undefined pairing indices if less than N points are found within the given radius.
1415

1516
# Version 2.13.7: Released Aug 22nd, 2024
1617
- Changes in apps:

libs/math/include/mrpt/math/KDTreeCapable.h

+13-3
Original file line numberDiff line numberDiff line change
@@ -340,12 +340,14 @@ class KDTreeCapable
340340
resultSet.init(&ret_indexes[0], &out_dist_sqr[0]);
341341

342342
m_kdtree2d_data.index->findNeighbors(resultSet, &query_point[0], {});
343+
ret_indexes.resize(resultSet.size());
344+
out_dist_sqr.resize(resultSet.size());
343345
#else
344346
THROW_EXCEPTION("RKNN search requires nanoflann>=1.5.1");
345347
#endif
346348
}
347349

348-
for (size_t i = 0; i < knn; i++)
350+
for (size_t i = 0; i < ret_indexes.size(); i++)
349351
{
350352
out_x[i] = derived().kdtree_get_pt(ret_indexes[i], 0);
351353
out_y[i] = derived().kdtree_get_pt(ret_indexes[i], 1);
@@ -423,6 +425,8 @@ class KDTreeCapable
423425
resultSet.init(&out_idx[0], &out_dist_sqr[0]);
424426

425427
m_kdtree2d_data.index->findNeighbors(resultSet, &query_point[0], {});
428+
out_idx.resize(resultSet.size());
429+
out_dist_sqr.resize(resultSet.size());
426430
#else
427431
THROW_EXCEPTION("RKNN search requires nanoflann>=1.5.1");
428432
#endif
@@ -579,12 +583,14 @@ class KDTreeCapable
579583
nanoflann::RKNNResultSet<num_t> resultSet(knn, *maximumSearchDistanceSqr);
580584
resultSet.init(&ret_indexes[0], &out_dist_sqr[0]);
581585
m_kdtree3d_data.index->findNeighbors(resultSet, &query_point[0], {});
586+
ret_indexes.resize(resultSet.size());
587+
out_dist_sqr.resize(resultSet.size());
582588
#else
583589
THROW_EXCEPTION("RKNN search requires nanoflann>=1.5.1");
584590
#endif
585591
}
586592

587-
for (size_t i = 0; i < knn; i++)
593+
for (size_t i = 0; i < ret_indexes.size(); i++)
588594
{
589595
out_x[i] = derived().kdtree_get_pt(ret_indexes[i], 0);
590596
out_y[i] = derived().kdtree_get_pt(ret_indexes[i], 1);
@@ -654,12 +660,14 @@ class KDTreeCapable
654660
nanoflann::RKNNResultSet<num_t> resultSet(knn, *maximumSearchDistanceSqr);
655661
resultSet.init(&out_idx[0], &out_dist_sqr[0]);
656662
m_kdtree3d_data.index->findNeighbors(resultSet, &query_point[0], {});
663+
out_idx.resize(resultSet.size());
664+
out_dist_sqr.resize(resultSet.size());
657665
#else
658666
THROW_EXCEPTION("RKNN search requires nanoflann>=1.5.1");
659667
#endif
660668
}
661669

662-
for (size_t i = 0; i < knn; i++)
670+
for (size_t i = 0; i < out_idx.size(); i++)
663671
{
664672
out_x[i] = derived().kdtree_get_pt(out_idx[i], 0);
665673
out_y[i] = derived().kdtree_get_pt(out_idx[i], 1);
@@ -805,6 +813,8 @@ class KDTreeCapable
805813
nanoflann::RKNNResultSet<num_t> resultSet(knn, *maximumSearchDistanceSqr);
806814
resultSet.init(&out_idx[0], &out_dist_sqr[0]);
807815
m_kdtree3d_data.index->findNeighbors(resultSet, &query_point[0], {});
816+
out_idx.resize(resultSet.size());
817+
out_dist_sqr.resize(resultSet.size());
808818
#else
809819
THROW_EXCEPTION("RKNN search requires nanoflann>=1.5.1");
810820
#endif

0 commit comments

Comments
 (0)