You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.9 KiB
52 lines
1.9 KiB
// tests5.rs
|
|
//
|
|
// An `unsafe` in Rust serves as a contract.
|
|
//
|
|
// When `unsafe` is marked on an item declaration, such as a function,
|
|
// a trait or so on, it declares a contract alongside it. However,
|
|
// the content of the contract cannot be expressed only by a single keyword.
|
|
// Hence, its your responsibility to manually state it in the `# Safety`
|
|
// section of your documentation comment on the item.
|
|
//
|
|
// When `unsafe` is marked on a code block enclosed by curly braces,
|
|
// it declares an observance of some contract, such as the validity of some
|
|
// pointer parameter, the ownership of some memory address. However, like
|
|
// the text above, you still need to state how the contract is observed in
|
|
// the comment on the code block.
|
|
//
|
|
// NOTE: All the comments are for the readability and the maintainability of
|
|
// your code, while the Rust compiler hands its trust of soundness of your
|
|
// code to yourself! If you cannot prove the memory safety and soundness of
|
|
// your own code, take a step back and use safe code instead!
|
|
//
|
|
// Execute `rustlings hint tests5` or use the `hint` watch subcommand for a
|
|
// hint.
|
|
|
|
// I AM NOT DONE
|
|
|
|
/// # Safety
|
|
///
|
|
/// The `address` must contain a mutable reference to a valid `u32` value.
|
|
unsafe fn modify_by_address(address: usize) {
|
|
// TODO: Fill your safety notice of the code block below to match your
|
|
// code's behavior and the contract of this function. You may use the
|
|
// comment of the test below as your format reference.
|
|
unsafe {
|
|
todo!("Your code goes here")
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_success() {
|
|
let mut t: u32 = 0x12345678;
|
|
// SAFETY: The address is guaranteed to be valid and contains
|
|
// a unique reference to a `u32` local variable.
|
|
unsafe { modify_by_address(&mut t as *mut u32 as usize) };
|
|
assert!(t == 0xAABBCCDD);
|
|
}
|
|
}
|