sdd / kiddo

Kiddo
Apache License 2.0
79 stars 13 forks source link

SIGSEGV when querying an empty ImmutableKdTree #155

Open jeromerobert opened 4 months ago

jeromerobert commented 4 months ago

Running this code with Kiddo 4.2.0:

kiddo::ImmutableKdTree::<f64, 3>::new_from_slice(&[]).nearest_one::<kiddo::float::distance::SquaredEuclidean>(&[0.; 3]);

leads to (signal: 11, SIGSEGV: invalid memory reference).

This patch:

--- a/src/immutable/common/generate_immutable_nearest_one.rs
+++ b/src/immutable/common/generate_immutable_nearest_one.rs
@@ -102,8 +102,7 @@ macro_rules! generate_immutable_nearest_one {
             ) where
                 D: DistanceMetric<A, K>,
             {
-                let leaf_node = unsafe { self.leaves.get_unchecked(leaf_idx) };
-                // let leaf_node = &self.leaves[leaf_idx];
+                let leaf_node = &self.leaves[leaf_idx];

                 let mut best_item = nearest.item;
                 let mut best_dist = nearest.distance;

allows to get a stack:

index out of bounds: the len is 0 but the index is 0
stack backtrace:
   0: rust_begin_unwind
             at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/std/src/panicking.rs:645:5
   1: core::panicking::panic_fmt
             at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/panicking.rs:72:14
   2: core::panicking::panic_bounds_check
             at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/panicking.rs:208:5
   3: <usize as core::slice::index::SliceIndex<[T]>>::index
             at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/slice/index.rs:255:10
   4: core::slice::index::<impl core::ops::index::Index<I> for [T]>::index
             at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/slice/index.rs:18:9
   5: <alloc::vec::Vec<T,A> as core::ops::index::Index<I>>::index
             at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/alloc/src/vec/mod.rs:2770:9
   6: kiddo::immutable::float::query::nearest_one::<impl kiddo::immutable::float::kdtree::ImmutableKdTree<A,T,_,_>>::search_leaf_for_nearest
             at /home/robert/kiddo/src/immutable/common/generate_immutable_nearest_one.rs:105:45
   7: kiddo::immutable::float::query::nearest_one::<impl kiddo::immutable::float::kdtree::ImmutableKdTree<A,T,_,_>>::nearest_one_recurse
             at /home/robert/kiddo/src/immutable/common/generate_immutable_nearest_one.rs:40:21
   8: kiddo::immutable::float::query::nearest_one::<impl kiddo::immutable::float::kdtree::ImmutableKdTree<A,T,_,_>>::nearest_one
             at /home/robert/kiddo/src/immutable/common/generate_immutable_nearest_one.rs:13:17
Imberflur commented 1 month ago

it seems like this should be closed, since a fix was merged?