我在标准库中查看了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为什么标准库里有这么多代码?语言如何仍然安全?
我想将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#有一个FastBitmap类,可以访问和修改am位图的像素信息.我已经在一些C#项目中使用过它,但我现在需要它在VB.NET中.问题是该类使用的是不安全的代码,这在VB.NET中是不受支持的.
问题是.我可以在DLL中编译FastBitmap类并在VB.NET中使用它吗?
[编辑]或者是否有一些库可用于修改VB.NET中的像素数据?
目前我有这个代码,它从包含类似内容的文件中读取[{'1': {'Score': '2', 'Class': '3'}}]并将其分配给变量:
exec('assigns = ' + open(r'D:\Dropbox\Dev\Output\dict', 'r').read())
Run Code Online (Sandbox Code Playgroud)
但是,我被告知使用exec是危险的.如何在不使用的情况下编写相同的代码exec?
我正在寻找一种方法来增加.NET应用程序的启动时间.
想法是在启动初始化后立即进行进程内存转储并将其存储在磁盘上.在第二次运行时,用转储和加速应用程序启动替换进程内存会很不错.
所以,我的问题:
谢谢.
最近我写了一些树,想尝试不安全的代码.最后我做的都没有不安全但是在这段代码中找到了一些模糊(对我而言)的地方(对于更短的代码,我删除所有逻辑,所以所有代码看起来都毫无意义):
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) 那里有一些我不喜欢的代码,因为它不安全,我想知道它是否可以安全:
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) 运行代码后如
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中?纯粹是为了稍后调试?
如果我有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库才能实现这一点.
这当然是不安全的,但这不是问题.
编辑:只是澄清:我正在复制到未初始化的内存.
我在玩不安全的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)