unsafe 相关问题

在C#或Rust中,unsafe关键字标记代码能够直接使用内存指针,绕过某些语言的安全检查。在Java中,`sun.misc.Unsafe`是一个执行低级,不安全操作的特殊类。

取消引用 *const Mutex 恐慌

我目前正在研究 FFI 库的安全绑定,这是我遇到的问题的最小实现。 fn test_weird_thing() { 使用 std::sync::Mutex; ...

回答 1 投票 0

如何将 u8 缓冲区转换为 Rust 中的结构体?

我有一个未知大小的字节缓冲区,我想创建一个指向缓冲区开头的内存的本地结构变量。按照我在 C 中所做的,我尝试了很多不同的薄...

回答 4 投票 0

为什么将 `&mut &mut i32` 转换为 `*mut *mut i32` 无效

我可以像这样在 Rust 中将 &mut i32 转换为 *mut i32 fn 主() { 令 mut x = 1; 让 mut xref = &mut x; 不安全{ 让 xref_ptr = xref as *mut i32; *xref_ptr = 2; } ...

回答 2 投票 0

在自引用结构中使用 'static 来引用 Box 可以吗?

给出下面的代码片段: 使用 std::{io::BufWriter, pin::Pin}; pub 结构自引用 { pub writer: BufWriter<&'static mut [u8]>, // 从缓冲区借用 酒吧缓冲区:Pin&l...

回答 1 投票 0

UnsafeCell 如何通知 rustc 选择退出基于别名的优化?

我正在阅读 rust std 文档并遇到了这一行: UnsafeCell 选择退出 &T 的不变性保证:共享引用 &UnsafeCell 可能指向

回答 1 投票 0

为什么 Rust 标准库有这么多不安全代码?

我在查看标准库中的 String ,发现有很多像这样的不安全代码: #[排队] #[稳定(功能=“rust1”,因为=“1.0.0”)] 酒吧 fn 删除...

回答 1 投票 0

我可以创建一个“不安全的关闭”吗?

我有一些代码,简化后如下所示: fn foo() -> Vec { 不安全{ unsafe_iterator().map(|n|wrap_element(n)).collect() } } 迭代器返回的项

回答 1 投票 0

使用“static”保存对同一结构体属性的引用是否安全?

在没有不安全块的情况下不可能解决的棘手问题是在结构中保存对此结构的其他属性所拥有的内容的引用。 然而,对于不安全的块,这很容易,一个......

回答 1 投票 0

为什么这个不安全的块会返回单位类型?

我不太明白不安全和作业如何协同工作。下面的代码给了我一些错误: fn num() -> u64 { 1; } fn 测试() -> u64 { 让 x = 不安全 { num();...

回答 1 投票 0

在构造函数中使用不安全和指针时,这种奇怪的行为是什么?

我遇到了一个奇怪的问题,程序的成功或失败取决于是否将我的不安全块放入构造函数中。不确定这是一个错误还是我只是在后者中很幸运......

回答 1 投票 0

Delphi:使用 [weak] 属性的对象聚合和内存泄漏

我想通过使用聚合来构建一个包含多个子对象的类 TParent。有些对象是独立的,而有些对象也可能依赖于其他子对象。所有的孩子们

回答 1 投票 0

出于学习目的在没有 Bitmap 类的情况下读取 BMP 文件,LockBits 问题(带有不安全块的 C#)

我有这样的Windows Forms项目,它读取24位RGB BMP文件。除了打印位图形成的方法之外,一切都工作正常。有一行带注释的代码,它完全取代了...

回答 1 投票 0

如何通过原始指针修改闭包内的结构体字段?

我有以下从 C 代码调用的线程过程的代码。 context 是指向堆上结构的指针 (Box::into_raw(Box::new(...))。闭包被传递给 add_callback 函数并存储在 vec...

回答 1 投票 0

将 `Arc<dyn Trait>` 向上转换为 `Arc<dyn Any>`?

假设我有一个Asset类型的trait对象,它存储在Arc中,我想将其转换为Arc以方便以后向下转型。 有什么安全的方法可以做到这一点吗?我有...

回答 1 投票 0

这个不安全的 Rust 代码有什么问题,所以它可以在 Windows 上运行,但不能在 Ubuntu 上运行?

您好,我知道代码可以完全编写,没有任何不安全的代码,但我正在做一项研究并学习“幕后”的工作原理。 回到正题,我写了一篇...

回答 1 投票 0

UnsafeCell:它如何通知 rustc 选择退出基于别名的优化?

我正在阅读 rust std 文档并遇到了这一行: UnsafeCell 选择退出 &T 的不变性保证:共享引用 &UnsafeCell 可能指向

回答 1 投票 0

无法移出类型`[T; D]`,非复制数组

我正在使用通过 FFI 调用的代码初始化一个数组,因此我使用一个数组 if MaybeUninit 来表示该数据。它看起来像这样: 使用 std::mem::MaybeUninit ; #[允许(未使用)]...

回答 1 投票 0

为什么这个指针在 Rust 中释放之前会被垃圾收集

fn test() -> *const Vec { 让 b = vec![9_u8]; 让 ret: *const Vec = &b; println!("ret ptr={:#p} inside {:#p}", ret, b.as_ptr()); std::mem::锻造...

回答 1 投票 0

`UnsafeCell` 在没有锁定的情况下跨线程共享 - 这可能会导致 UB,对吗?

考虑以下代码: 使用 std::{cell::UnsafeCell, io, net::TcpStream,sync::Arc}; 使用native_tls::TlsStream; #[导出(调试)] pub 结构 TcpStreamRecv(Arc 考虑以下代码: use std::{cell::UnsafeCell, io, net::TcpStream, sync::Arc}; use native_tls::TlsStream; #[derive(Debug)] pub struct TcpStreamRecv(Arc<UnsafeCell<TlsStream<TcpStream>>>); unsafe impl Send for TcpStreamRecv {} unsafe impl Sync for TcpStreamRecv {} impl io::Read for TcpStreamRecv { fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { unsafe { &mut *self.0.get() }.read(buf) } } #[derive(Debug)] pub struct TcpStreamSend(Arc<UnsafeCell<TlsStream<TcpStream>>>); unsafe impl Send for TcpStreamSend {} unsafe impl Sync for TcpStreamSend {} impl io::Write for TcpStreamSend { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { unsafe { &mut *self.0.get() }.write(buf) } fn flush(&mut self) -> io::Result<()> { unsafe { &mut *self.0.get() }.flush() } } pub fn tcp_split(stream: TlsStream<TcpStream>) -> (TcpStreamSend, TcpStreamRecv) { let inner = Arc::new(UnsafeCell::new(stream)); let send = TcpStreamSend(inner.clone()); let recv = TcpStreamRecv(inner); (send, recv) } 我的推理如下: 安全代码可以获得具有相同底层 TlsStream 的 TcpStreamSend 和 TcpStreamRecv。 如果每个都发送到单独的线程,则可以同时调用 TcpStreamSend::write 和 TcpStreamRecv::read。这些函数中的每一个都会获得对底层 TlsStream 的 &mut 引用。 因此,由于同时拥有 2 个可变引用是非法的,因此这段代码可能会导致 UB,应该被认为是不健全的。这是正确的吗? 我的同事向我保证“如果它有效,它就有效”,并且代码确实在大多数情况下都可以正常运行,除了一些随机的偶尔的恐慌之外。然而,根据我的理解,它可能会在我们的代码库中的任何地方导致不可预测的问题,应该立即重写。我错过了什么吗? 顺便说一句,我做了一些研究,代码似乎受到了这个SO答案的启发,它更复杂,但是,据我所知,同样糟糕。 绝对不健全。 在 Rust 中同时存在两个重叠的 &mut 引用是未定义的行为,如果两个线程同时调用 read 和 write,就会发生这种情况。即使对于非线程代码来说这也是一个问题 - Rust 假设没有 &mut 引用可以别名。 在没有锁的情况下分割TlsStream是不可能的。即使 TcpStream 中的读取和写入实现是独立的,TlsStream 也可能需要根据来自服务器的消息更改其写入方式(例如重新生成密钥),这将要求读取器更改写入器使用的状态。

回答 1 投票 0

将指针参数传递给 unsafe.Pointer

使用有什么问题 方法一: func 编码(v *float32) []byte { 返回 unsafe.Slice((*byte)(unsafe.Pointer(v)), 4) } 超过 方法二 功能编码(v float32)[]字节{ 返回...

回答 0 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.