kiddo icon indicating copy to clipboard operation
kiddo copied to clipboard

SIGSEGV when querying an empty ImmutableKdTree

Open jeromerobert opened this issue 1 year ago • 1 comments

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

jeromerobert avatar Mar 01 '24 14:03 jeromerobert

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

Imberflur avatar May 20 '24 21:05 Imberflur

This issue should be resolved in https://github.com/sdd/kiddo/pull/186 as part of the rewrite of the ImmutableKdTree, which was just released as Kiddo v5.0.0 🎉

https://crates.io/crates/kiddo/5.0.0

I know this issue was raised a while ago, and you have probably moved on, but if you do get chance to try v5 I'd love to hear any feedback. I'm closing this issue.

sdd avatar Dec 04 '24 20:12 sdd