]> git.bitcoin.ninja Git - dnssec-prover/commitdiff
Drop MSRV to 1.63 w/o `RUSTC_BOOTSTRAP` hacks with a bad assumption
authorMatt Corallo <git@bluematt.me>
Wed, 10 Jul 2024 14:09:47 +0000 (14:09 +0000)
committerMatt Corallo <git@bluematt.me>
Wed, 10 Jul 2024 14:09:47 +0000 (14:09 +0000)
While the Rust language reference says "you should not rely on
this", in practice slices are laid out in memory as a two-tuple of
`(pointer, length)`. Here we rely on that assumption to replace
`alloc::slice::from_raw_parts` with a `core::mem::transmute`.

src/crypto/bigint.rs
src/http.rs
src/lib.rs
test.sh

index ff478eec6fe65eed692575b733b41fbca025cca5..0b87ac702fcd30046b5980b560a5f1262dd501e7 100644 (file)
@@ -29,11 +29,23 @@ const fn const_subslice<'a, T>(a: &'a [T], start: usize, end: usize) -> &'a [T]
        assert!(end >= start);
        let mut startptr = a.as_ptr();
        startptr = unsafe { startptr.add(start) };
-       let len = end - start;
-       // The docs for from_raw_parts do not mention any requirements that the pointer be valid if the
+       let len: usize = end - start;
+       // We should use alloc::slice::from_raw_parts here, but sadly it was only stabilized as const
+       // in 1.64, whereas we need an MSRV of 1.63. Instead we rely on that which "you should not rely
+       // on" - that slices are laid out as a simple tuple of pointer + length.
+       //
+       // The Rust language reference doesn't specify the layout of slices at all, but does give us a
+       // hint, saying
+       //   Note: Though you should not rely on this, all pointers to DSTs are currently twice the
+       //   size of the size of usize and have the same alignment.
+       // This leaves only two possibilities (for today's rust) - `(length, pointer)` and
+       // `(pointer, length)`. Today, in practice, this seems to always be `(pointer, length)`, so we
+       // just assume it and hope to move to a later MSRV soon.
+       unsafe { core::mem::transmute((startptr, len)) }
+       /*// The docs for from_raw_parts do not mention any requirements that the pointer be valid if the
        // length is zero, aside from requiring proper alignment (which is met here). Thus,
        // one-past-the-end should be an acceptable pointer for a 0-length slice.
-       unsafe { alloc::slice::from_raw_parts(startptr, len) }
+       unsafe { alloc::slice::from_raw_parts(startptr, len) }*/
 }
 
 /// Const version of `dest[dest_start..dest_end].copy_from_slice(source)`
index 00383b679b91dafd26c0545a29b999a26c0d6531..3079ed227a949d4e2e30b153b677b8b8c81a0db0 100644 (file)
@@ -2,10 +2,6 @@
 
 #![deny(missing_docs)]
 
-// const_slice_from_raw_parts was stabilized in 1.64, however we support building on 1.63 as well.
-// Luckily, it seems to work fine in 1.63 with the feature flag (and RUSTC_BOOTSTRAP=1) enabled.
-#![cfg_attr(all(feature = "validation", rust_1_63), feature(const_slice_from_raw_parts))]
-
 #![allow(clippy::new_without_default)] // why is this even a lint
 #![allow(clippy::result_unit_err)] // Why in the hell is this a lint?
 #![allow(clippy::get_first)] // Sometimes this improves readability
index 4cf920da84cf423bb0eb70ddaebdb735b765576f..27421ed828174a74f6c9fe8aa21c19077910bb40 100644 (file)
 #![deny(rustdoc::broken_intra_doc_links)]
 #![deny(rustdoc::private_intra_doc_links)]
 
-// const_slice_from_raw_parts was stabilized in 1.64, however we support building on 1.63 as well.
-// Luckily, it seems to work fine in 1.63 with the feature flag (and RUSTC_BOOTSTRAP=1) enabled.
-#![cfg_attr(rust_1_63, feature(const_slice_from_raw_parts))]
-
 #![allow(clippy::new_without_default)] // why is this even a lint
 #![allow(clippy::result_unit_err)] // Why in the hell is this a lint?
 #![allow(clippy::get_first)] // Sometimes this improves readability
diff --git a/test.sh b/test.sh
index 0ffe7052727ccd41aa962a1cdd8a5eab654db34c..d16e03a3212e556f0e65bce36cf3f0e56a550911 100755 (executable)
--- a/test.sh
+++ b/test.sh
@@ -1,12 +1,6 @@
 #!/bin/sh
 set -eox
 
-RUSTC_MINOR_VERSION=$(rustc --version | awk '{ split($2,a,"."); print a[2] }')
-if [ "$RUSTC_MINOR_VERSION" = 63 ]; then
-       export RUSTC_BOOTSTRAP=1
-       export RUSTFLAGS=--cfg=rust_1_63
-fi
-
 cargo test --no-default-features
 cargo test
 cargo test --no-default-features --features std
@@ -23,7 +17,7 @@ cargo build --lib --features std,tokio,validation --release
 cargo build --bin http_proof_gen --features build_server
 cargo doc --features std,tokio,validation
 cd fuzz
-RUSTFLAGS="$RUSTFLAGS --cfg=fuzzing" RUSTC_BOOTSTRAP=1 cargo build --features stdin_fuzz
-RUSTFLAGS="$RUSTFLAGS --cfg=fuzzing" RUSTC_BOOTSTRAP=1 cargo test
+RUSTFLAGS="--cfg=fuzzing" RUSTC_BOOTSTRAP=1 cargo build --features stdin_fuzz
+RUSTFLAGS="--cfg=fuzzing" RUSTC_BOOTSTRAP=1 cargo test
 cd ../bench
-RUSTFLAGS="$RUSTFLAGS --cfg=dnssec_validate_bench" cargo bench
+RUSTFLAGS="--cfg=dnssec_validate_bench" cargo bench