标签: unsafe

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

我在标准库中查看了String很多unsafe这样的代码:

    #[inline]
    #[stable(feature = "rust1", since = "1.0.0")]
    pub fn remove(&mut self, idx: usize) -> char {
        let ch = match self[idx..].chars().next() {
            Some(ch) => ch,
            None => panic!("cannot remove a char from the end of a string"),
        };

        let next = idx + ch.len_utf8();
        let len = self.len();
        unsafe {
            ptr::copy(self.vec.as_ptr().add(next), self.vec.as_mut_ptr().add(idx), len - next);
            self.vec.set_len(len - (next - idx));
        }
        ch
    }
Run Code Online (Sandbox Code Playgroud)

unsafe为什么标准库里有这么多代码?语言如何仍然安全?

unsafe rust

3
推荐指数
1
解决办法
1136
查看次数

C#:将通用指针转换为数组

我想将a转换byte*为a byte[],但我也希望有一个可重用的函数来执行此操作:

public unsafe static T[] Create<T>(T* ptr, int length)
{
    T[] array = new T[length];

    for (int i = 0; i < length; i++)
        array[i] = ptr[i];

    return array;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是我收到编译器错误,因为T可能是".NET托管类型",我们无法指向那些.更令人沮丧的是,没有泛型类型约束可以将T限制为"非托管类型".是否有内置的.NET函数来执行此操作?有任何想法吗?

c# arrays unsafe

2
推荐指数
1
解决办法
1万
查看次数

我可以在VB.NET中使用带有不安全代码的C#dll吗?

C#有一个FastBitmap类,可以访问和修改am位图的像素信息.我已经在一些C#项目中使用过它,但我现在需要它在VB.NET中.问题是该类使用的是不安全的代码,这在VB.NET中是不受支持的.

问题是.我可以在DLL中编译FastBitmap类并在VB.NET中使用它吗?

[编辑]或者是否有一些库可用于修改VB.NET中的像素数据?

c# vb.net dll unsafe pixel

2
推荐指数
1
解决办法
1657
查看次数

从没有exec的文件中读取列表和dicts

目前我有这个代码,它从包含类似内容的文件中读取[{'1': {'Score': '2', 'Class': '3'}}]并将其分配给变量:

exec('assigns = ' + open(r'D:\Dropbox\Dev\Output\dict', 'r').read())
Run Code Online (Sandbox Code Playgroud)

但是,我被告知使用exec是危险的.如何在不使用的情况下编写相同的代码exec

python io unsafe exec

2
推荐指数
1
解决办法
110
查看次数

进行进程内存转储,稍后在.NET中进行恢复

我正在寻找一种方法来增加.NET应用程序的启动时间.

想法是在启动初始化后立即进行进程内存转储并将其存储在磁盘上.在第二次运行时,用转储和加速应用程序启动替换进程内存会很不错.

所以,我的问题:

  1. 有没有办法转储.NET进程内存?
  2. 有没有办法从该转储恢复进程内存状态?
  3. 解决方案(如果存在)是否适用于IIS托管的ASP.NET应用程序?

谢谢.

.net clr performance memory-management unsafe

2
推荐指数
1
解决办法
679
查看次数

隐藏c#中不安全的代码行为

最近我写了一些树,想尝试不安全的代码.最后我做的都没有不安全但是在这段代码中找到了一些模糊(对我而言)的地方(对于更短的代码,我删除所有逻辑,所以所有代码看起来都毫无意义):

public static void Main() {
        EqClass a = new EqClass();
        a.AddElement(2, new record(3)); // *place1*
                    ...
            }
    unsafe struct node {
        public node* next;
        public record Value;
        public node(record value) {
            this = new node();
            this.Value = value;
        }
    }
    struct record {
        public int a;
        public record(int a) {
            this.a = a;
        }
    }
    unsafe class EqClass {
        node*[] last = new node*[3];
        public void AddElement(int classIndex, record element) {
            node a = new node(element);
            node* newNode = …
Run Code Online (Sandbox Code Playgroud)

c# unsafe

2
推荐指数
1
解决办法
147
查看次数

在C#中使不安全的代码安全

我最近在C#中阅读了一篇关于图像处理的文章

那里有一些我不喜欢的代码,因为它不安全,我想知道它是否可以安全:

public static bool Invert(Bitmap b)
{
    // GDI+ still lies to us - the return format is BGR, NOT RGB. 
    BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), 
        ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
    int stride = bmData.Stride; 
    System.IntPtr Scan0 = bmData.Scan0; 
    unsafe 
    { 
        byte * p = (byte *)(void *)Scan0;
        int nOffset = stride - b.Width*3; 
        int nWidth = b.Width * 3;
        for(int y=0;y < b.Height;++y)
        {
            for(int x=0; x < nWidth; ++x )
            {
                p[0] = …
Run Code Online (Sandbox Code Playgroud)

.net c# gdi+ pointers unsafe

2
推荐指数
1
解决办法
803
查看次数

JVM崩溃时异常中显示的奇怪路径

运行代码后如

public static void main(String... args) throws Exception {
    getUnsafe().getByte(0);
}

private static Unsafe getUnsafe() throws NoSuchFieldException, IllegalAccessException {
    Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
    theUnsafe.setAccessible(true);
    return (Unsafe) theUnsafe.get(null);
}    
Run Code Online (Sandbox Code Playgroud)

这会导致JVM崩溃,然后查看记录的输出,在Internal exceptions部分下显示一些奇怪的路径:

    thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u60\4407\hotspot\srÚÞ ©Ö_®?
    thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u60\4407\hotspot\src\share\vm\prims\j
Run Code Online (Sandbox Code Playgroud)

我绝对没有在我的本地机器上使用这些路径,并且一些谷歌搜索显示它们经常在这些故障转储中结束.我假设它们来自最初编译JDK的时候.

我的问题是 - 这是正确的吗?为什么这些信息会被整合到JDK中?纯粹是为了稍后调试?

java jvm unsafe java-8

2
推荐指数
1
解决办法
114
查看次数

将结构复制到Rust中的特定内存位置

如果我有struct,例如:

#[derive(Clone, Copy)]
#[repr(C, packed)]
pub struct SomeData {
    a: u16,
    b: u64,
    c: u32,
    d: u16,
}
Run Code Online (Sandbox Code Playgroud)

如何将其复制到内存中的特定位置,例如0x1000有效地复制到内存中的某个位置?会这样的吗?

let dst_addr: u64 = 0x1000;
let src = SomeData {a: 1, b: 2, c: 3, d: 4};
unsafe {
    let tmp: &[u8; 10] = transmute(src);
    copy(dst_addr as *mut _, tmp);
}
Run Code Online (Sandbox Code Playgroud)

请注意,repr(C, packed)这里实际需要这部分.

该软件在裸x86_64,ring 0上运行,没有操作系统或其他限制.另外,我在没有标准库的情况下进行编程,因此只有core库才能实现这一点.

这当然是不安全的,但这不是问题.

编辑:只是澄清:我正在复制到未初始化的内存.

unsafe low-level rust memmove raw-pointer

2
推荐指数
1
解决办法
551
查看次数

为什么在使用不安全的Rust访问超出范围的变量时没有段错误?

我在玩不安全的Rust时遇到了这种奇怪的现象.我认为这段代码应该会出现分段错误,但事实并非如此.我错过了什么吗?我试图设置一个指向一个生命周期较短的变量的指针,然后取消引用它.

// function that sets a pointer to a variable with a shorter lifetime
unsafe fn what(p: &mut *const i32) {
    let a = 2;
    *p = &a;
    //let addr = *p;    // I will talk about this later
    println!("inside: {}", **p);
}

fn main() {
    let mut p: *const i32 = 0 as *const i32;
    unsafe {
        what(&mut p);

        // I thought this line would make a segfault because 'a' goes out of scope at the end of the …
Run Code Online (Sandbox Code Playgroud)

memory unsafe unsafe-pointers rust

2
推荐指数
1
解决办法
130
查看次数