unsafe 相关问题

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

Rust:将 Arc<dyn Trait> 转换为 Arc<dyn Any>?

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

回答 1 投票 0

为什么 Rust 的原始指针可以访问超出范围的结构变量的函数和部分字段信息?

我想使用像*const这样的Rust原始指针来重现释放后使用的安全问题,但是当我使用原始指针访问字段或调用已释放的结构变量的函数时,...

回答 1 投票 0

发送字符串

假设我在我的 Rust 程序的主线程中构造一个 String 来简单地将这个字符串转换为多个字节,忘记原始 String 对象,并传递给另一个线程,它正在......

回答 0 投票 0

是否有任何 rust 函数用于包装依赖于引用的迭代器,以便包装器包含引用对象?

在这种情况下,我想从标准输入中读取整数,以便它们由空格和换行符分隔。我的第一次尝试类似于以下代码: fn splitter(x: String) -> impl It...

回答 0 投票 0

在 Rust 中的 `v : T` 中,`Layout::from_value(&v)` 和 `Layout::new::<T>` 可以不同吗?

我正在从标准库中实现我自己的 Box 以学习如何编写不安全的代码。 我的实现看起来像: 使用 std::marker::PhantomData; 使用 std::{alloc, mem, ptr}; 使用...

回答 1 投票 0

不可变上下文的不安全变异在发布模式下失败

在下面的代码中,我使用不安全代码将一个不可变引用转换为一个可变指针,然后我尝试通过这个可变指针来编辑内部值。 fn 主(){ #[repr(运输...

回答 1 投票 0

在 Rust 中设计一个具有可变 getter 和不可变 getter 的特征,并默认实现不可变 getter

我想设计一个 trait,它有一个可变的和一个不可变的 getter 到 self 的某个领域。 但是,我希望 trait 的实现者只需要实现一个方法,通常是可变的 gett ...

回答 1 投票 0

为什么不能在 C# 7.2 的结构中同时使用只读缓冲区和固定大小缓冲区

随着 C# 7.2 的发布,现在可以拥有只读结构,这在许多情况下可以提高性能。 对于我的一个结构,我使用固定大小的字节数组来实际保存...

回答 2 投票 0

我的静态github页面被标记为欺诈网站

我在我的 git hub 帐户上托管了一个个人投资组合和一个 firebase 应用程序。它运行了一段时间,但他们最近被标记为不安全。在我的投资组合中,用户无处输入 d...

回答 0 投票 0

为什么必须在使用 Unsafe 修改另一个类的静态最终字段之前创建或调用 Java 类?

我尝试应用 sun.misc.Unsafe 修改某些类的 public static final 字段以进行单元测试和 jmh 基准测试。至少用 JDK11 到 JDK17 进行测试,它似乎只有在......之后才能正常工作

回答 0 投票 0

如何访问私有字段并调用它的公共函数?

myConn和Conn其实是在不同的包里,所以想通过unsafe或者reflect获取myConn未导出的c。 第一种方法是符合预期, 我不知道为什么第二次遇到...

回答 0 投票 0

输出总是单音的

我正在尝试使用 PortAudio 的 Go 绑定来播放立体声数据。奇怪的是,在两个通道中只播放流的右通道,左通道被静音。 这是我的代码: ... // 在里面 ...

回答 0 投票 0

就地转换 Vec<u32> 为 Vec<u8>,开销最小

我正在尝试将 u32s 的 Vec 转换为 u8s 的 Vec,最好是就地且没有太多开销。 我当前的解决方案依赖于不安全的代码来重新构造 Vec。有没有更好的方法做

回答 5 投票 0

为什么固定大小的缓冲区(数组)一定是不安全的?

假设我想要一个 7 字节(或 3 或 777)的值类型。 我可以这样定义它: 公共结构 Buffer71 { 公共字节 b0; 公共字节 b1; 公共字节 b2; 公共字节 b3;...

回答 2 投票 0

使用最小起订量模拟不安全的接口

是否可以使用 Moq 来模拟不安全的接口?例如我有(MCVE): [测试类] 公开课UnitTest1 { [测试方法] 公共不安全无效 TestMethod1() { 模拟<

回答 3 投票 0

How to safely reinterpret Vec<f64> as Vec<num_complex::Complex<f64>> with half size?

我通过外部 C 库(最好不要更改)以 [i_0_real, i_0_imag, i_1_real, i_1_imag, ...] 的形式将复数数据填充到 Vec 中,看起来这个 Vec 我通过外部 C 库(最好不要更改)以 Vec<f64> 的形式将复数数据填充到 [i_0_real, i_0_imag, i_1_real, i_1_imag, ...] 中,看起来这个 Vec<f64> 具有与一半的 Vec<num_complex::Complex<f64>> 相同的内存布局鉴于num_complex::Complex<f64>的数据结构与[f64; 2]的内存布局兼容,如here所述,长度将是。我想这样使用它而不需要重新分配一个可能很大的缓冲区。 我假设在 from_raw_parts() 中使用 std::vec::Vec 来伪造一个新的 Vec 是有效的,它拥有旧的 Vec 的记忆(通过忘记旧的 Vec)并使用 size / 2和capacity / 2,但这需要不安全的代码。是否有一种“安全”的方式来进行这种数据重新解释? Vec 在 Rust 中分配为 Vec<f64> 并由使用 .as_mut_ptr() 填充 Vec<f64> 的 C 函数填充。 我当前的编译不安全实现: extern crate num_complex; pub fn convert_to_complex_unsafe(mut buffer: Vec<f64>) -> Vec<num_complex::Complex<f64>> { let new_vec = unsafe { Vec::from_raw_parts( buffer.as_mut_ptr() as *mut num_complex::Complex<f64>, buffer.len() / 2, buffer.capacity() / 2, ) }; std::mem::forget(buffer); return new_vec; } fn main() { println!( "Converted vector: {:?}", convert_to_complex_unsafe(vec![3.0, 4.0, 5.0, 6.0]) ); } 是否有一种“安全”的方式来进行这种数据重新解释? 没有。至少,这是因为你需要知道的信息没有在 Rust 类型系统中表达,而是通过散文(也就是文档)表达: Complex<T> 是与数组兼容的内存布局[T; 2]. — Complex 文档 如果一个 Vec 已经分配了内存,那么 [...] 它的指针指向 len 按顺序初始化的连续元素(如果你将它强制为一个切片你会看到什么), — Vec 文档 数组强制切片 ([T]) — 数组文档 由于Complex与数组内存兼容,数组的数据与切片内存兼容,而Vec的数据与切片内存兼容,这种转换应该是安全的,即使编译器不能告诉这个。 此信息应附加(通过评论)到您的不安全块。 我会对你的功能做一些小的调整: 同时有两个Vec指向相同的数据让我非常紧张。这可以通过引入一些变量并在创建另一个之前忘记一个变量来避免。 删除return关键字更地道 添加一些断言数据的起始长度是二的倍数 正如 rodrigo 指出的,容量很可能是奇数。为了避免这种情况,我们调用shrink_to_fit。这样做的缺点是 Vec may 需要重新分配和复制内存,具体取决于实现。 展开unsafe块以覆盖确保安全不变量得到维护所需的所有相关代码。 pub fn convert_to_complex(mut buffer: Vec<f64>) -> Vec<num_complex::Complex<f64>> { // This is where I'd put the rationale for why this `unsafe` block // upholds the guarantees that I must ensure. Too bad I // copy-and-pasted from Stack Overflow without reading this comment! unsafe { buffer.shrink_to_fit(); let ptr = buffer.as_mut_ptr() as *mut num_complex::Complex<f64>; let len = buffer.len(); let cap = buffer.capacity(); assert!(len % 2 == 0); assert!(cap % 2 == 0); std::mem::forget(buffer); Vec::from_raw_parts(ptr, len / 2, cap / 2) } } 为了避免所有关于容量的担忧,您可以将切片转换为Vec。这也没有任何额外的内存分配。它更简单,因为我们可以“丢失”任何奇数尾随值,因为 Vec 仍然保持它们。 pub fn convert_to_complex(buffer: &[f64]) -> &[num_complex::Complex<f64>] { // This is where I'd put the rationale for why this `unsafe` block // upholds the guarantees that I must ensure. Too bad I // copy-and-pasted from Stack Overflow without reading this comment! unsafe { let ptr = buffer.as_ptr() as *mut num_complex::Complex<f64>; let len = buffer.len(); assert!(len % 2 == 0); std::slice::from_raw_parts(ptr, len / 2) } }

回答 1 投票 0

移除Java 9中的sun.misc.Unsafe会破坏Spring、Hibernate。

我在这里读到,如果Oracle在Java 9中删除sun.misc.Unsafe,Spring和许多其他流行的库将会崩溃。 然而,在Spring或Hibernate中没有对这个类的静态引用。那么,是...

回答 4 投票 14

C++CLI和C#VB的不安全和extern有什么区别?

.NET有C#和VB*作为(相对)高级语言,它们都是编译成.NET CLI中间代码(.NET相当于Java的 "字节码"),而不是原生机器代码。有 ...

回答 1 投票 0

从语义学的角度来看,Rust中的"&mut "noalias的未定义行为是什么时候发生的?

正如Rust参考文献所说 打破了指针别名规则.&mut T和&T遵循LLVM的scoped noalias模型,除非&T包含一个UnsafeCell。这真是...

回答 1 投票 3

有没有一种安全的方法让一个结构存储一个将在结构外被修改的向量的片断?

我正在实现处理长度为k*n的向量的代码,并创建了k个长度为n的点,这些点引用了原始向量的一个片断: struct Point { values: &'a [f32], } impl&...。

回答 1 投票 -1

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