dimforge / dimforge/rapier

It's possible to make `convex_decomposition` panic

Open
#223 4 comments 1 reaction 0 assignees View on GitHub
Dominant language
Rust
Stars
5.7k
Forks
387
Avg merge
4d 23h
Merged PRs (30d)
6

Description

I was able to pass some inputs that made `convex_decomposition` panic. I was testing it in 2D, and one of the ways to make it panic was to pass several (3 or more) identical points in a row.

Here's the backtrace I've got:
```
thread 'Compute Task Pool (0)' panicked at 'Matrix index out of bounds.', /Users/mvlabat/.cargo/registry/src/github.com-1ecc6299db9ec823/parry2d-0.5.1/src/query/clip/clip_aabb_line.rs:141:13
stack backtrace:
0: std::panicking::begin_panic
at /rustc/59216858a323978a97593cba22b5ed84350a3783/library/std/src/panicking.rs:541:12
1: nalgebra::base::ops:: for nalgebra::base::matrix::Matrix>::index_mut
at /Users/mvlabat/.cargo/registry/src/github.com-1ecc6299db9ec823/nalgebra-0.27.1/src/base/ops.rs:69:9
2: nalgebra::base::ops:: for nalgebra::base::matrix::Matrix>::index_mut
at /Users/mvlabat/.cargo/registry/src/github.com-1ecc6299db9ec823/nalgebra-0.27.1/src/base/ops.rs:57:14
3: parry2d::query::clip::clip_aabb_line::clip_aabb_line
at /Users/mvlabat/.cargo/registry/src/github.com-1ecc6299db9ec823/parry2d-0.5.1/src/query/clip/clip_aabb_line.rs:141:13
4: parry2d::query::clip::clip_aabb_line::::clip_segment
at /Users/mvlabat/.cargo/registry/src/github.com-1ecc6299db9ec823/parry2d-0.5.1/src/query/clip/clip_aabb_line.rs:14:9
5: parry2d::transformation::voxelization::voxel_set::VoxelSet::do_compute_exact_convex_hull
at /Users/mvlabat/.cargo/registry/src/github.com-1ecc6299db9ec823/parry2d-0.5.1/src/transformation/voxelization/voxel_set.rs:244:40
6: parry2d::transformation::voxelization::voxel_set::VoxelSet::compute_exact_convex_hull
at /Users/mvlabat/.cargo/registry/src/github.com-1ecc6299db9ec823/parry2d-0.5.1/src/transformation/voxelization/voxel_set.rs:189:9
7: parry2d::transformation::vhacd::vhacd::VHACD::compute_exact_convex_hulls::{{closure}}
at /Users/mvlabat/.cargo/registry/src/github.com-1ecc6299db9ec823/parry2d-0.5.1/src/transformation/vhacd/vhacd.rs:518:25
8: core::iter::adapters::map::map_fold::{{closure}}
at /rustc/59216858a323978a97593cba22b5ed84350a3783/library/core/src/iter/adapters/map.rs:82:28
9: core::iter::traits::iterator::Iterator::fold
at /rustc/59216858a323978a97593cba22b5ed84350a3783/library/core/src/iter/traits/iterator.rs:2173:21
10: as core::iter::traits::iterator::Iterator>::fold
at /rustc/59216858a323978a97593cba22b5ed84350a3783/library/core/src/iter/adapters/map.rs:122:9
11: core::iter::traits::iterator::Iterator::for_each
at /rustc/59216858a323978a97593cba22b5ed84350a3783/library/core/src/iter/traits/iterator.rs:736:9
12: as alloc::vec::spec_extend::SpecExtend>::spec_extend
at /rustc/59216858a323978a97593cba22b5ed84350a3783/library/alloc/src/vec/spec_extend.rs:40:17
13: as alloc::vec::spec_from_iter_nested::SpecFromIterNested>::from_iter
at /rustc/59216858a323978a97593cba22b5ed84350a3783/library/alloc/src/vec/spec_from_iter_nested.rs:56:9
14: as alloc::vec::spec_from_iter::SpecFromIter>::from_iter
at /rustc/59216858a323978a97593cba22b5ed84350a3783/library/alloc/src/vec/spec_from_iter.rs:33:9
15: as core::iter::traits::collect::FromIterator>::from_iter
at /rustc/59216858a323978a97593cba22b5ed84350a3783/library/alloc/src/vec/mod.rs:2453:9
16: core::iter::traits::iterator::Iterator::collect
at /rustc/59216858a323978a97593cba22b5ed84350a3783/library/core/src/iter/traits/iterator.rs:1748:9
17: parry2d::transformation::vhacd::vhacd::VHACD::compute_exact_convex_hulls
at /Users/mvlabat/.cargo/registry/src/github.com-1ecc6299db9ec823/parry2d-0.5.1/src/transformation/vhacd/vhacd.rs:516:9
18: parry2d::shape::shared_shape::SharedShape::convex_decomposition_with_params
at /Users/mvlabat/.cargo/registry/src/github.com-1ecc6299db9ec823/parry2d-0.5.1/src/shape/shared_shape.rs:204:25
```

I assume it might be not the only scenario when decomposition can fail if users come up with some other invalid inputs. So I have a couple of questions:
1. Is it possible to change this function's function signature to return `Option` or `Result`, to make the error recoverable?
2. Is there any reliable way to validate the parameters? They might be coming as user input, panicking in such a case would be undesirable.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.