正文
声名狼藉的程序分段错误(Segmentation Fault)是C语言的常见问题,而通常NULL dereferences是第一大诱因。如果开发者忘记了检查所返回的指针是否正确性,就可能会导致空指针引用。
uint8_t* pointer = (uint8_t*) malloc(SIZE); // Might return NULLfor(int i = 0 ; i
Rust处理这类指针错误的方式非常极端,在“安全”代码中粗暴简单地禁用所有裸指针。此外在“安全”代码中,Rust还取消了空值。
不过不用担心,Rust中存在一个优雅的替代方案——引用和借贷的方式。本质上来说,这些引用(references)还是那些老指针,但有了生命周期(Lifetimes)和借贷(Borrowing)规则,系统就能确保代码的安全性。
let my_var: u32 = 42;let my_ref: &u32 = &my_var; //
释放内存后再使用(Use After Free)
这一弊端会产生严重的漏洞,导致黑客随意操控你的代码。
下面有一个样例:
uint8_t* pointer = (uint8_t*) malloc(SIZE);...if (err) {
abort = 1;
free(pointer);
}...if (abort) {
logError("operation aborted before commit", pointer);
}
像C++一样,Rust也使用资源获取即初始化(Resource Acquisition Is Initialization)的方式,这意味着每个变量在超出范围后都一定会被释放,因此在“安全的”Rust代码中,永远不必担心释放内存的事情。