Skip to content

Commit 74bfab3

Browse files
committed
Merge remote-tracking branch 'origin/main' into metrics-tooling2
2 parents 1a05e22 + f804a33 commit 74bfab3

File tree

54 files changed

+364
-358
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+364
-358
lines changed

.github/workflows/kani-metrics.yml

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

2828
- name: Compute Kani Metrics
29-
run: ./scripts/run-kani.sh --run metrics --path ${{github.workspace}}
29+
run: ./scripts/run-kani.sh --run metrics --with-autoharness --path ${{github.workspace}}
3030

3131
- name: Create Pull Request
3232
uses: peter-evans/create-pull-request@v7

.github/workflows/kani.yml

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

56+
kani-autoharness:
57+
name: Verify std library using autoharness
58+
runs-on: ${{ matrix.os }}
59+
strategy:
60+
matrix:
61+
os: [ubuntu-latest, macos-latest]
62+
include:
63+
- os: ubuntu-latest
64+
base: ubuntu
65+
- os: macos-latest
66+
base: macos
67+
fail-fast: false
68+
69+
steps:
70+
# Step 1: Check out the repository
71+
- name: Checkout Repository
72+
uses: actions/checkout@v4
73+
with:
74+
submodules: true
75+
76+
# Step 2: Run Kani autoharness on the std library for selected functions.
77+
# Uses "--include-pattern" to make sure we do not try to run across all
78+
# possible functions as that may take a lot longer than expected. Instead,
79+
# explicitly list all functions (or prefixes thereof) the proofs of which
80+
# are known to pass.
81+
- name: Run Kani Verification
82+
run: |
83+
scripts/run-kani.sh --run autoharness --kani-args \
84+
--include-pattern alloc::layout::Layout::from_size_align \
85+
--include-pattern ascii::ascii_char::AsciiChar::from_u8 \
86+
--include-pattern char::convert::from_u32_unchecked \
87+
--include-pattern "num::nonzero::NonZero::<i8>::count_ones" \
88+
--include-pattern "num::nonzero::NonZero::<i16>::count_ones" \
89+
--include-pattern "num::nonzero::NonZero::<i32>::count_ones" \
90+
--include-pattern "num::nonzero::NonZero::<i64>::count_ones" \
91+
--include-pattern "num::nonzero::NonZero::<i128>::count_ones" \
92+
--include-pattern "num::nonzero::NonZero::<isize>::count_ones" \
93+
--include-pattern "num::nonzero::NonZero::<u8>::count_ones" \
94+
--include-pattern "num::nonzero::NonZero::<u16>::count_ones" \
95+
--include-pattern "num::nonzero::NonZero::<u32>::count_ones" \
96+
--include-pattern "num::nonzero::NonZero::<u64>::count_ones" \
97+
--include-pattern "num::nonzero::NonZero::<u128>::count_ones" \
98+
--include-pattern "num::nonzero::NonZero::<usize>::count_ones" \
99+
--include-pattern "num::nonzero::NonZero::<i8>::rotate_" \
100+
--include-pattern "num::nonzero::NonZero::<i16>::rotate_" \
101+
--include-pattern "num::nonzero::NonZero::<i32>::rotate_" \
102+
--include-pattern "num::nonzero::NonZero::<i64>::rotate_" \
103+
--include-pattern "num::nonzero::NonZero::<i128>::rotate_" \
104+
--include-pattern "num::nonzero::NonZero::<isize>::rotate_" \
105+
--include-pattern "num::nonzero::NonZero::<u8>::rotate_" \
106+
--include-pattern "num::nonzero::NonZero::<u16>::rotate_" \
107+
--include-pattern "num::nonzero::NonZero::<u32>::rotate_" \
108+
--include-pattern "num::nonzero::NonZero::<u64>::rotate_" \
109+
--include-pattern "num::nonzero::NonZero::<u128>::rotate_" \
110+
--include-pattern "num::nonzero::NonZero::<usize>::rotate_" \
111+
--include-pattern ptr::align_offset::mod_inv \
112+
--include-pattern ptr::alignment::Alignment::as_nonzero \
113+
--include-pattern ptr::alignment::Alignment::as_usize \
114+
--include-pattern ptr::alignment::Alignment::log2 \
115+
--include-pattern ptr::alignment::Alignment::mask \
116+
--include-pattern ptr::alignment::Alignment::new \
117+
--include-pattern ptr::alignment::Alignment::new_unchecked \
118+
--include-pattern time::Duration::from_micros \
119+
--include-pattern time::Duration::from_millis \
120+
--include-pattern time::Duration::from_nanos \
121+
--include-pattern time::Duration::from_secs \
122+
--exclude-pattern time::Duration::from_secs_f \
123+
--include-pattern unicode::unicode_data::conversions::to_ \
124+
--exclude-pattern ::precondition_check \
125+
--harness-timeout 5m \
126+
--default-unwind 1000 \
127+
--jobs=3 --output-format=terse
128+
56129
run-kani-list:
57130
name: Kani List
58131
runs-on: ubuntu-latest
@@ -66,8 +139,14 @@ jobs:
66139

67140
# Step 2: Run list on the std library
68141
- name: Run Kani List
69-
run: head/scripts/run-kani.sh --run list --path ${{github.workspace}}/head
70-
142+
run: |
143+
head/scripts/run-kani.sh --run list --with-autoharness --path ${{github.workspace}}/head
144+
# remove duplicate white space to reduce file size (GitHub permits at
145+
# most one 1MB)
146+
ls -l ${{github.workspace}}/head/kani-list.md
147+
perl -p -i -e 's/ +/ /g' ${{github.workspace}}/head/kani-list.md
148+
ls -l ${{github.workspace}}/head/kani-list.md
149+
71150
# Step 3: Add output to job summary
72151
- name: Add Kani List output to job summary
73152
uses: actions/github-script@v6
@@ -79,3 +158,30 @@ jobs:
79158
.addHeading('Kani List Output', 2)
80159
.addRaw(kaniOutput, false)
81160
.write();
161+
162+
run-autoharness-analyzer:
163+
name: Kani Autoharness Analyzer
164+
runs-on: ubuntu-latest
165+
steps:
166+
# Step 1: Check out the repository
167+
- name: Checkout Repository
168+
uses: actions/checkout@v4
169+
with:
170+
submodules: true
171+
172+
# Step 2: Run autoharness analyzer on the std library
173+
- name: Run Autoharness Analyzer
174+
run: scripts/run-kani.sh --run autoharness-analyzer
175+
176+
# Step 3: Add output to job summary
177+
- name: Add Autoharness Analyzer output to job summary
178+
run: |
179+
echo "# Autoharness Failure Summary" >> "$GITHUB_STEP_SUMMARY"
180+
echo "## Crate core, all functions" >> "$GITHUB_STEP_SUMMARY"
181+
cat autoharness_analyzer/core_autoharness_data.md >> "$GITHUB_STEP_SUMMARY"
182+
echo "## Crate core, unsafe functions" >> "$GITHUB_STEP_SUMMARY"
183+
cat autoharness_analyzer/core_autoharness_data.md >> "$GITHUB_STEP_SUMMARY"
184+
echo "## Crate std, all functions" >> "$GITHUB_STEP_SUMMARY"
185+
cat autoharness_analyzer/std_autoharness_data.md >> "$GITHUB_STEP_SUMMARY"
186+
echo "## Crate std, unsafe functions" >> "$GITHUB_STEP_SUMMARY"
187+
cat autoharness_analyzer/std_unsafe_autoharness_data.md >> "$GITHUB_STEP_SUMMARY"

doc/src/SUMMARY.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,4 @@
3131
- [15: Contracts and Tests for SIMD Intrinsics](./challenges/0015-intrinsics-simd.md)
3232
- [16: Verify the safety of Iterator functions](./challenges/0016-iter.md)
3333
- [17: Verify the safety of slice functions](./challenges/0017-slice.md)
34-
- [18: Verify the safety of slice iter functions](./challenges/0018-slice-iter-pt1.md)
34+
- [18: Verify the safety of slice iter functions](./challenges/0018-slice-iter.md)

library/Cargo.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

library/alloc/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ bench = false
1616

1717
[dependencies]
1818
core = { path = "../core", public = true }
19-
compiler_builtins = { version = "=0.1.155", features = ['rustc-dep-of-std'] }
2019
safety = { path = "../contracts/safety" }
20+
compiler_builtins = { version = "=0.1.156", features = ['rustc-dep-of-std'] }
2121

2222
[features]
2323
compiler-builtins-mem = ['compiler_builtins/mem']

library/alloc/src/ffi/c_str.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ impl CString {
574574
#[stable(feature = "as_c_str", since = "1.20.0")]
575575
#[rustc_diagnostic_item = "cstring_as_c_str"]
576576
pub fn as_c_str(&self) -> &CStr {
577-
&*self
577+
unsafe { CStr::from_bytes_with_nul_unchecked(self.as_bytes_with_nul()) }
578578
}
579579

580580
/// Converts this `CString` into a boxed [`CStr`].
@@ -705,14 +705,14 @@ impl ops::Deref for CString {
705705

706706
#[inline]
707707
fn deref(&self) -> &CStr {
708-
unsafe { CStr::from_bytes_with_nul_unchecked(self.as_bytes_with_nul()) }
708+
self.as_c_str()
709709
}
710710
}
711711

712712
#[stable(feature = "rust1", since = "1.0.0")]
713713
impl fmt::Debug for CString {
714714
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
715-
fmt::Debug::fmt(&**self, f)
715+
fmt::Debug::fmt(self.as_c_str(), f)
716716
}
717717
}
718718

library/alloctests/tests/c_str2.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,6 @@ fn build_with_zero2() {
3333
assert!(CString::new(vec![0]).is_err());
3434
}
3535

36-
#[test]
37-
fn formatted() {
38-
let s = CString::new(&b"abc\x01\x02\n\xE2\x80\xA6\xFF"[..]).unwrap();
39-
assert_eq!(format!("{s:?}"), r#""abc\x01\x02\n\xe2\x80\xa6\xff""#);
40-
}
41-
4236
#[test]
4337
fn borrowed() {
4438
unsafe {

library/core/src/alloc/layout.rs

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -637,24 +637,6 @@ mod verify {
637637
}
638638
}
639639

640-
// pub const fn from_size_align(size: usize, align: usize) -> Result<Self, LayoutError>
641-
#[kani::proof_for_contract(Layout::from_size_align)]
642-
pub fn check_from_size_align() {
643-
let s = kani::any::<usize>();
644-
let a = kani::any::<usize>();
645-
let _ = Layout::from_size_align(s, a);
646-
}
647-
648-
// pub const unsafe fn from_size_align_unchecked(size: usize, align: usize) -> Self
649-
#[kani::proof_for_contract(Layout::from_size_align_unchecked)]
650-
pub fn check_from_size_align_unchecked() {
651-
let s = kani::any::<usize>();
652-
let a = kani::any::<usize>();
653-
unsafe {
654-
let _ = Layout::from_size_align_unchecked(s, a);
655-
}
656-
}
657-
658640
// pub const fn size(&self) -> usize
659641
#[kani::proof]
660642
pub fn check_size() {

library/core/src/any.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -772,8 +772,8 @@ impl hash::Hash for TypeId {
772772
// (especially given the previous point about the lower 64 bits being
773773
// high quality on their own).
774774
// - It is correct to do so -- only hashing a subset of `self` is still
775-
// with an `Eq` implementation that considers the entire value, as
776-
// ours does.
775+
// compatible with an `Eq` implementation that considers the entire
776+
// value, as ours does.
777777
self.t.1.hash(state);
778778
}
779779
}

library/core/src/arch.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub macro asm("assembly template", $(operands,)* $(options($(option),*))?) {
3232
///
3333
/// [Rust By Example]: https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html
3434
/// [reference]: https://doc.rust-lang.org/nightly/reference/inline-assembly.html
35-
#[unstable(feature = "naked_functions", issue = "90957")]
35+
#[stable(feature = "naked_functions", since = "CURRENT_RUSTC_VERSION")]
3636
#[rustc_builtin_macro]
3737
pub macro naked_asm("assembly template", $(operands,)* $(options($(option),*))?) {
3838
/* compiler built-in */

0 commit comments

Comments
 (0)