Rust语言圣经 Rust逆向入门:从反编译视角学习内存模型

rust的特性

一、所有权系统
  • 所有权机制: rust拥有独特的所有权系统,确保在编译时就能够管理内存安全,避免了常见的内存错误,如空指针引用、野指针、悬垂指针和数据竞争等。 每个值都有一个所有者,并且在同一时间只有一个所有者,当所有者离开作用域时,其拥有的值会被自动释放。
fn main(){
    let s=String::new();//当s离开main函数的作用域时,String的内存会被自动释放
}
  • 借用规则: 可以通过引用(借用)来访问数据而不获取所有权。引用分为不可变引用(&T)和可变引用(&mut T) 可以有多个不可变引用,但在同一时间只能有一个可变引用,防止了数据竞争。
  • 生命周期
fn longest<'a>(x:&'a str,y:&'a str)->&'a str{
    if x.len()>y.len(){
        x
    }else{
        y
    }
}
二、模式匹配
  • 强大的模式匹配:
enum Message{
    Quit,
    Move{x:i32,y:i32},
    Write(String),
    ChangeColor(i32,i32,i32),
}

fn main(){
    let msg=Message::ChangeColor(255,0,0);
    match msg{
        Message::Quit=>println!("quit"),
        Message::Move{x,y}=>println!("move to x={},y={}",x,y),
        Message::Write(s)=>println!("write {}",s),
        Message::ChangeColor(r,g,b)=>println!("change color to r={},g={},b={}",r,g,b),
    }
}
  • 匹配守卫和绑定:
fn main(){
    let num=Some(5);
    if let Some(x)=num{
        if x>10{
            println!("x is greater than 10");
        }else{
            println!("x is less than 10");
        }
    }
}
三、错误处理
  • Result和Option类型:
use std::fs::File;

fn main(){
    let f=File::open("test.txt");
    match f{
        Ok(file)=>println!("File opened:{:?}",file),
        Err(e)=>println!("Error opening file:{}",e),
    }
}
  • ?操作符
use std::fs::File;
use std::io::Read;

fn read_file()->Result<String,std::io::Error>{
    let mut f=File::open("test.txt")?;
    let mut s=String::new();
    f.read_to_string(&mut s)?;
    Ok(s)
}

fn main(){
    match read_file(){
        Ok(s)=>println!("File contents:{}",s),
        Err(e)=>println!("Error reading file:{}",e),
    }
}
四、模块和包管理
  • 模块系统:
mod my_module{
    pub fn hello(){
        println!("Hello from my module!");
    }
}
fn main(){
    my_module::hello();
}
  • cargo包管理
五、并发和执行
  • 安全的并发
use std::thread;

fn main() {
    let handle = thread::spawn(|| {
        println!("thread");
    });

    handle.join().unwrap();
}
  • send和sync标记特征:
六、宏系统
  • 声明宏和过程宏:
macro_rules! say_hello{
    ()=>(
        println!("hello world!");
    );
}
fn main(){
    say_hello!();
}
七、抽象
  • 迭代器、闭包、trait
fn main(){
    let v=vec![1,2,3];
    let sum:i32=v.iter().map(|x| x*2).sum();
    println!("{}",sum);
}
八、安全的FFI支持
  • 外部函数接口(FFI):
extern "C"{
    fn sqrt(x:f64)->f64;
}

fn main(){
    unsafe{
        let result=sqrt(4.0);
        println!("{}",result);
    }
}
九、零碎知识
  • 闭包: 闭包是一种匿名函数,它可以赋值给变量也可以作为参数传递给其它函数,不同于函数的是,它允许捕获调用者作用域中的值。
fn main(){
    let x=1;
    let sum=|y| x+y;
    assert_eq!(3,sum(3));
}
use std::thread;
use std::time::Duration;

fn workout(intensity: u32, random_number: u32) {
    let action = || {
        println!("muuuu.....");
        thread::sleep(Duration::from_secs(2));
        intensity
    };

    if intensity < 25 {
        println!(
            "今天活力满满,先做 {} 个俯卧撑!",
            action()
        );
        println!(
            "旁边有妹子在看,俯卧撑太low,再来 {} 组卧推!",
            action()
        );
    } else if random_number == 3 {
        println!("昨天练过度了,今天还是休息下吧!");
    } else {
        println!(
            "昨天练过度了,今天干干有氧,跑步 {} 分钟!",
            action()
        );
    }
}

fn main() {
    // 动作次数
    let intensity = 10;
    // 随机值用来决定某个选择
    let random_number = 7;

    // 开始健身
    workout(intensity, random_number);
}