Skip to content

Commit 5595535

Browse files
authored
Challenge proposal: SmallSort (#57)
1 parent 03c735b commit 5595535

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

doc/src/SUMMARY.md

+1
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@
1818
- [Pointer Arithmetic](./challenges/0003-pointer-arithmentic.md)
1919
- [Memory safety of BTreeMap's `btree::node` module](./challenges/0004-btree-node.md)
2020
- [Inductive data type](./challenges/0005-linked-list.md)
21+
- [Contracts for SmallSort](./challenges/0008-smallsort.md)

doc/src/challenges/0008-smallsort

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# Challenge 8: Contracts for SmallSort
2+
3+
- **Status:** Open
4+
- **Tracking Issue:** [Link to issue](https://github.com/model-checking/verify-rust-std/issues/56)
5+
- **Start date:** *2024-08-17*
6+
- **End date:** *2024-12-10*
7+
8+
-------------------
9+
10+
11+
## Goal
12+
13+
The implementations of the traits `StableSmallSortTypeImpl`, `UnstableSmallSortTypeImpl`, and `UnstableSmallSortFreezeTypeImpl` in the `smallsort` [module](https://github.com/rust-lang/rust/blob/master/library/core/src/slice/sort/shared/smallsort.rs) of the Rust standard library are the sorting
14+
algorithms optimized for slices with small lengths.
15+
In this challenge, the goal is to, first prove the memory safety of the public functions in the `smallsort` module, and, second, write contracts for them to
16+
show that the sorting algorithms actually sort the slices.
17+
18+
### Success Criteria
19+
20+
Prove absence of undefined behavior of the following public functions.
21+
22+
1. `<T as slice::sort::shared::smallsort::StableSmallSortTypeImpl>::small_sort`
23+
2. `<T as slice::sort::shared::smallsort::UnstableSmallSortTypeImpl>::small_sort`
24+
3. `<T as slice::sort::shared::smallsort::UnstableSmallSortFreezeTypeImpl>::small_sort`
25+
4. `slice::sort::shared::smallsort::swap_if_less`
26+
5. `slice::sort::shared::smallsort::insertion_sort_shift_left`
27+
6. `slice::sort::shared::smallsort::sort4_stable`
28+
7. `slice::sort::shared::smallsort::has_efficient_in_place_swap`
29+
30+
Write contracts for the following public functions that show that they actually sort the slices.
31+
32+
1. `<T as slice::sort::shared::smallsort::StableSmallSortTypeImpl>::small_sort`
33+
2. `<T as slice::sort::shared::smallsort::UnstableSmallSortTypeImpl>::small_sort`
34+
3. `<T as slice::sort::shared::smallsort::UnstableSmallSortFreezeTypeImpl>::small_sort`
35+
36+
The memory safety and the contracts of the above listed functions must be verified
37+
for all possible slices with arbitrary valid length.
38+
39+
Note that most of the functions listed above call functions that contain loops.
40+
Function contracts and loop contracts of those callee functions may be required.
41+
42+
### List of UBs
43+
44+
In addition to any properties called out as `SAFETY` comments in the source
45+
code,
46+
all proofs must automatically ensure the absence of the following [undefined behaviors](https://github.com/rust-lang/reference/blob/142b2ed77d33f37a9973772bd95e6144ed9dce43/src/behavior-considered-undefined.md):
47+
48+
* Accessing (loading from or storing to) a place that is dangling or based on a misaligned pointer.
49+
* Reading from uninitialized memory.
50+
* Mutating immutable bytes.
51+
* Producing an invalid value
52+
53+
Note: All solutions to verification challenges need to satisfy the criteria established in the [challenge book](../general-rules.md)
54+
in addition to the ones listed above.

0 commit comments

Comments
 (0)