Closed
Description
Possibly as a result of some u8-specific optimizations, a const &[u8]
returned by std::slice::from_raw_parts
has a different address than all other uses of the same expression. Forum discussion.
I tried this code:
use std::ptr::NonNull;
use std::slice::from_raw_parts;
const PTR_U8: *const u8 = NonNull::dangling().as_ptr();
const CONST_U8_REF: &[u8] = unsafe { from_raw_parts(PTR_U8, 0) };
const CONST_U8_PTR: *const u8 = unsafe { from_raw_parts(PTR_U8, 0).as_ptr() };
static STATIC_U8_REF: &[u8] = unsafe { from_raw_parts(PTR_U8, 0) };
const PTR_U16: *const u16 = NonNull::dangling().as_ptr();
const CONST_U16_REF: &[u16] = unsafe { from_raw_parts(PTR_U16, 0) };
const fn const_u8_fn() -> &'static [u8] {
unsafe { from_raw_parts(PTR_U8, 0) }
}
fn main() {
let ptr_u8 = unsafe { from_raw_parts(PTR_U8, 0) }.as_ptr();
let ptr_u16 = unsafe { from_raw_parts(PTR_U16, 0) }.as_ptr();
assert_eq!(ptr_u8, PTR_U8); // OK
assert_eq!(ptr_u8, CONST_U8_PTR); // OK
assert_eq!(ptr_u8, const_u8_fn().as_ptr()); // OK
assert_eq!(ptr_u8, STATIC_U8_REF.as_ptr()); // OK
assert_eq!(ptr_u16, CONST_U16_REF.as_ptr()); // OK
assert_eq!(ptr_u8, CONST_U8_REF.as_ptr()); // ERROR
}
I expected to see this happen: All assertions should pass.
Instead, this happened:
thread 'main' panicked at 'assertion failed: `(left == right)`
left: `0x1`,
right: `0x55f434eaa038`', src/main.rs:25:5
Meta
rustc --version --verbose
:
rustc 1.65.0 (897e37553 2022-11-02)
binary: rustc
commit-hash: 897e37553bba8b42751c67658967889d11ecd120
commit-date: 2022-11-02
host: x86_64-pc-windows-msvc
release: 1.65.0
LLVM version: 15.0.0
Backtrace
thread 'main' panicked at 'assertion failed: `(left == right)`
left: `0x1`,
right: `0x55c4dc25b038`', src/main.rs:25:5
stack backtrace:
0: rust_begin_unwind
at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/panicking.rs:584:5
1: core::panicking::panic_fmt
at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/core/src/panicking.rs:142:14
2: core::panicking::assert_failed_inner
3: core::panicking::assert_failed
at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/core/src/panicking.rs:181:5
4: playground::main
at ./[src/main.rs:25](https://play.rust-lang.org/#):5
5: core::ops::function::FnOnce::call_once
at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/core/src/ops/function.rs:248:5