P.UNS.MEM.02 不能修改其它进程或动态库的内存变量

【描述】

除非调用合法的API,否则不要尝试修改其它进程/动态库的内存数据,否则会出现内存段错误(SIGSEGV)。

【反例】

sqlite3_libversion() 返回的 sqlite 版本信息指针指向 /usr/lib/libsqlite3.so 动态库的 static 字符串。

libsqlite3.so 中分配的静态字符串不属于进程的内存范围中。

当进程尝试修改 sqlite 动态库的静态字符串内容,操作系统就会发送 SIGSEGV 信号终止进程,以保证 sqlite 动态库的内存数据安全。


#![allow(unused)]
fn main() {
#[link(name = "sqlite3")]
extern "C" {
    fn sqlite3_libversion() -> *mut std::os::raw::c_char;
}

fn edit_sqlite_version() {
    unsafe {
        let mut sqlite_version = sqlite3_libversion();
        // SIGSEGV: invalid memory reference
        *sqlite_version = 3;
    }
}
}