Skip to content

Commit 88cfe84

Browse files
authored
Merge branch 'main' into contracts-uint_macros
2 parents 9588fa8 + 07b7465 commit 88cfe84

File tree

11 files changed

+1136
-4
lines changed

11 files changed

+1136
-4
lines changed

.github/workflows/kani-metrics.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ jobs:
2626
python-version: '3.x'
2727

2828
- name: Compute Kani Metrics
29-
run: ./scripts/run-kani.sh --run metrics --with-autoharness --path ${{github.workspace}}
29+
run: |
30+
./scripts/run-kani.sh --run metrics --with-autoharness --path ${{github.workspace}}
31+
rm kani-list.json
3032
3133
- name: Create Pull Request
3234
uses: peter-evans/create-pull-request@v7

.github/workflows/kani.yml

Lines changed: 117 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ jobs:
5353
- name: Run Kani Verification
5454
run: head/scripts/run-kani.sh --path ${{github.workspace}}/head
5555

56-
kani-autoharness:
56+
kani_autoharness:
5757
name: Verify std library using autoharness
5858
runs-on: ${{ matrix.os }}
5959
strategy:
@@ -87,6 +87,7 @@ jobs:
8787
scripts/run-kani.sh --run autoharness --kani-args \
8888
--include-pattern ">::disjoint_bitor" \
8989
--include-pattern ">::unchecked_disjoint_bitor" \
90+
--include-pattern alloc::__default_lib_allocator:: \
9091
--include-pattern alloc::layout::Layout::from_size_align \
9192
--include-pattern ascii::ascii_char::AsciiChar::from_u8 \
9293
--include-pattern char::convert::from_u32_unchecked \
@@ -130,7 +131,121 @@ jobs:
130131
--exclude-pattern ::precondition_check \
131132
--harness-timeout 10m \
132133
--default-unwind 1000 \
133-
--jobs=3 --output-format=terse
134+
--jobs=3 --output-format=terse | tee autoharness-verification.log
135+
gzip autoharness-verification.log
136+
137+
- name: Upload Autoharness Verification Log
138+
uses: actions/upload-artifact@v4
139+
with:
140+
name: ${{ matrix.os }}-autoharness-verification.log.gz
141+
path: autoharness-verification.log.gz
142+
if-no-files-found: error
143+
# Aggressively short retention: we don't really need these
144+
retention-days: 3
145+
146+
run_kani_metrics:
147+
name: Kani Metrics
148+
runs-on: ${{ matrix.os }}
149+
strategy:
150+
matrix:
151+
os: [ubuntu-latest, macos-latest]
152+
include:
153+
- os: ubuntu-latest
154+
base: ubuntu
155+
- os: macos-latest
156+
base: macos
157+
fail-fast: true
158+
159+
steps:
160+
# Step 1: Check out the repository
161+
- name: Checkout Repository
162+
uses: actions/checkout@v4
163+
with:
164+
submodules: true
165+
166+
# The Kani metrics collection uses a Python script (kani_std_analysis.py), so make sure Python is installed
167+
- name: Set up Python
168+
uses: actions/setup-python@v4
169+
with:
170+
python-version: '3.x'
171+
172+
# Step 2: Run list on the std library
173+
- name: Run Kani Metrics
174+
run: |
175+
scripts/run-kani.sh --run metrics --with-autoharness
176+
pushd /tmp/std_lib_analysis
177+
tar czf results.tar.gz results
178+
popd
179+
180+
- name: Upload kani-list.json
181+
uses: actions/upload-artifact@v4
182+
with:
183+
name: ${{ matrix.os }}-kani-list.json
184+
path: kani-list.json
185+
if-no-files-found: error
186+
# Aggressively short retention: we don't really need these
187+
retention-days: 3
188+
189+
- name: Upload scanner results
190+
uses: actions/upload-artifact@v4
191+
with:
192+
name: ${{ matrix.os }}-results.tar.gz
193+
path: /tmp/std_lib_analysis/results.tar.gz
194+
if-no-files-found: error
195+
# Aggressively short retention: we don't really need these
196+
retention-days: 3
197+
198+
run-log-analysis:
199+
name: Build JSON from logs
200+
needs: [run_kani_metrics, kani_autoharness]
201+
runs-on: ${{ matrix.os }}
202+
strategy:
203+
matrix:
204+
os: [ubuntu-latest, macos-latest]
205+
include:
206+
- os: ubuntu-latest
207+
base: ubuntu
208+
- os: macos-latest
209+
base: macos
210+
fail-fast: false
211+
212+
steps:
213+
- name: Checkout Repository
214+
uses: actions/checkout@v4
215+
with:
216+
submodules: false
217+
218+
- name: Download log
219+
uses: actions/download-artifact@v4
220+
with:
221+
name: ${{ matrix.os }}-autoharness-verification.log.gz
222+
223+
- name: Download kani-list.json
224+
uses: actions/download-artifact@v4
225+
with:
226+
name: ${{ matrix.os }}-kani-list.json
227+
228+
- name: Download scanner results
229+
uses: actions/download-artifact@v4
230+
with:
231+
name: ${{ matrix.os }}-results.tar.gz
232+
233+
- name: Run log parser
234+
run: |
235+
gunzip autoharness-verification.log.gz
236+
tar xzf results.tar.gz
237+
python3 scripts/kani-std-analysis/log_parser.py \
238+
--kani-list-file kani-list.json \
239+
--analysis-results-dir results/ \
240+
autoharness-verification.log \
241+
-o results.json
242+
243+
- name: Upload JSON
244+
uses: actions/upload-artifact@v4
245+
with:
246+
name: ${{ matrix.os }}-results.json
247+
path: results.json
248+
if-no-files-found: error
134249

135250
run-kani-list:
136251
name: Kani List

doc/src/SUMMARY.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,8 @@
3232
- [16: Verify the safety of Iterator functions](./challenges/0016-iter.md)
3333
- [17: Verify the safety of slice functions](./challenges/0017-slice.md)
3434
- [18: Verify the safety of slice iter functions](./challenges/0018-slice-iter.md)
35+
- [19: Safety of `RawVec`](./challenges/0019-rawvec.md)
36+
- [20: Verify the safety of char-related functions in str::pattern](./challenges/0020-str-pattern-pt1.md)
37+
- [21: Verify the safety of substring-related functions in str::pattern](./challenges/0021-str-pattern-pt2.md)
38+
- [22: Verify the safety of str iter functions](./challenges/0022-str-iter.md)
39+
- [25: Verify the safety of `VecDeque` functions](./challenges/0025-vecdeque.md)

doc/src/challenges/0019-rawvec.md

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Challenge 25: Verify the safety of `RawVec` functions
2+
3+
- **Status:** Open
4+
- **Tracking Issue:** [#283](https://github.com/model-checking/verify-rust-std/issues/283)
5+
- **Start date:** *2025-03-07*
6+
- **End date:** *2025-10-17*
7+
- **Reward:** *10000 USD*
8+
9+
-------------------
10+
11+
12+
## Goal
13+
14+
Verify the safety of `RawVec` functions in (library/alloc/src/raw_vec/mod.rs).
15+
16+
## Motivation
17+
18+
`RawVec` is the type of the main component of both `Vec` and `VecDeque`: the buffer. Therefore, the safety of the functions of `Vec` and `VecDeque` depend on the safety of `RawVec`.
19+
20+
### Success Criteria
21+
22+
Verify the safety of the following functions in (library/alloc/src/raw_vec/mod.rs):
23+
24+
Write and prove the contract for the safety of the following unsafe functions:
25+
26+
| Function |
27+
|---------|
28+
|new_cap|
29+
|into_box|
30+
|from_raw_parts_in|
31+
|from_nonnull_in|
32+
|set_ptr_and_cap|
33+
|shrink_unchecked|
34+
|deallocate|
35+
36+
Prove the absence of undefined behavior for following safe abstractions:
37+
38+
| Function |
39+
|---------|
40+
|drop|
41+
|new_in|
42+
|with_capacity_in|
43+
|try_allocate_in|
44+
|current_memory|
45+
|try_reserve|
46+
|try_reserve_exact|
47+
|grow_amortized|
48+
|grow_exact|
49+
|shrink|
50+
|finish_grow|
51+
52+
The verification must be unbounded---it must hold for slices of arbitrary length.
53+
54+
The verification must hold for generic type `T` (no monomorphization).
55+
56+
### List of UBs
57+
58+
All proofs must automatically ensure the absence of the following undefined behaviors [ref](https://github.com/rust-lang/reference/blob/142b2ed77d33f37a9973772bd95e6144ed9dce43/src/behavior-considered-undefined.md):
59+
60+
* Accessing (loading from or storing to) a place that is dangling or based on a misaligned pointer.
61+
* Reading from uninitialized memory except for padding or unions.
62+
* Mutating immutable bytes.
63+
* Producing an invalid value
64+
65+
66+
Note: All solutions to verification challenges need to satisfy the criteria established in the [challenge book](../general-rules.md)
67+
in addition to the ones listed above.
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# Challenge 20: Verify the safety of char-related functions in str::pattern
2+
3+
- **Status:** Open
4+
- **Tracking Issue:** [#277](https://github.com/model-checking/verify-rust-std/issues/277)
5+
- **Start date:** *2025-03-07*
6+
- **End date:** *2025-10-17*
7+
- **Reward:** *25000 USD*
8+
9+
-------------------
10+
## Goal
11+
Verify the safety of char-related `Searcher` methods in `str::pattern`.
12+
13+
## Motivation
14+
15+
String and `str` types are widely used in Rust programs, so it is important that their associated functions do not cause undefined behavior.
16+
17+
## Description
18+
19+
The following str library functions are generic over the `Pattern` trait (https://doc.rust-lang.org/std/str/pattern/trait.Pattern.html):
20+
- `contains`
21+
- `starts_with`
22+
- `ends_with`
23+
- `find`
24+
- `rfind`
25+
- `split`
26+
- `split_inclusive`
27+
- `rsplit`
28+
- `split_terminator`
29+
- `rsplit_terminator`
30+
- `splitn`
31+
- `rsplitn`
32+
- `split_once`
33+
- `rsplit_once`
34+
- `rmatches`
35+
- `match_indices`
36+
- `rmatch_indices`
37+
- `trim_matches`
38+
- `trim_start_matches`
39+
- `strip_prefix`
40+
- `strip_suffix`
41+
- `trim_end_matches`
42+
These functions accept a pattern as input, then call [into_searcher](https://doc.rust-lang.org/std/str/pattern/trait.Pattern.html#tymethod.into_searcher) to create a [Searcher](https://doc.rust-lang.org/std/str/pattern/trait.Pattern.html#associatedtype.Searcher) for the pattern. They use this `Searcher` to perform their desired operations (split, find, etc.).
43+
Those functions are implemented in (library/core/src/str/mod.rs), but the core of them are the searching algorithms which are implemented in (library/core/src/str/pattern.rs).
44+
45+
### Assumptions
46+
47+
**Important note:** for this challenge, you can assume:
48+
1. The safety and functional correctness of all functions in `slice` module.
49+
2. That all functions in (library/core/src/str/validations.rs) are functionally correct (consistent with the UTF-8 encoding description in https://en.wikipedia.org/wiki/UTF-8).
50+
3. That all the Searchers in (library/core/src/str/iter.rs) are created by the into_searcher(_, haystack) with haystack being a valid UTF-8 string (str). You can assume any UTF-8 string property of haystack.
51+
52+
Verify the safety of the functions in (library/core/src/str/pattern.rs) listed in the next section.
53+
54+
The safety properties we are targeting are:
55+
1. No undefined behavior occurs after the Searcher is created.
56+
2. The impls of unsafe traits `Searcher` and `ReverseSearcher` satisfy the SAFETY condition stated in the file:
57+
```
58+
/// The trait is marked unsafe because the indices returned by the
59+
/// [`next()`][Searcher::next] methods are required to lie on valid utf8
60+
/// boundaries in the haystack. This enables consumers of this trait to
61+
/// slice the haystack without additional runtime checks.
62+
```
63+
This property should hold for next_back() of `ReverseSearcher` too.
64+
65+
66+
### Success Criteria
67+
68+
Verify the safety of the following functions in (library/core/src/str/pattern.rs) :
69+
- `next`
70+
- `next_match`
71+
- `next_back`
72+
- `next_match_back`
73+
- `next_reject`
74+
- `next_back_reject`
75+
for the following `Searcher`s:
76+
- `CharSearcher`
77+
- `MultiCharEqSearcher`
78+
- `CharArraySearcher`
79+
- `CharArrayRefSearcher`
80+
- `CharSliceSearcher`
81+
- `CharPredicateSearcher`
82+
83+
The verification is considered successful if for each `Searcher` above, you can specify a condition (a "type invariant") `C` and prove that:
84+
1. If the `Searcher` is created from any valid UTF-8 haystack, it satisfies `C`.
85+
2. If the `Searcher` satisfies `C`, it ensures the two safety properties mentioned in the previous section.
86+
3. If the `Searcher` satisfies `C`, after it calls any function above and gets modified, it still satisfies `C`.
87+
88+
Furthermore, you must prove the absence of undefined behaviors listed in the next section.
89+
90+
The verification must be unbounded---it must hold for inputs of arbitrary size.
91+
92+
### List of UBs
93+
94+
All proofs must automatically ensure the absence of the following undefined behaviors [ref](https://github.com/rust-lang/reference/blob/142b2ed77d33f37a9973772bd95e6144ed9dce43/src/behavior-considered-undefined.md):
95+
96+
* Accessing (loading from or storing to) a place that is dangling or based on a misaligned pointer.
97+
* Reading from uninitialized memory except for padding or unions.
98+
* Mutating immutable bytes.
99+
* Producing an invalid value
100+
101+
102+
Note: All solutions to verification challenges need to satisfy the criteria established in the [challenge book](../general-rules.md)
103+
in addition to the ones listed above.

0 commit comments

Comments
 (0)