pub fn safe_copy(dest: &mut [u8], src: &[u8]) -> Result<(), &'static str> {
if dest.len() < src.len() {
return Err("Destination buffer too small");
}
dest[..src.len()].copy_from_slice(src);
Ok(())
}
pub fn safe_array_access() {
let array = [1, 2, 3, 4, 5];
let _first = array[0];
match array.get(10) {
Some(value) => println!("Value: {}", value),
None => println!("Index out of bounds (safely handled)"),
}
}
pub fn safe_vector_usage() {
let mut vec = Vec::new();
vec.push(1);
vec.push(2);
vec.push(3);
for item in &vec {
println!("{}", item);
}
if let Some(value) = vec.get(5) {
println!("Value at index 5: {}", value);
} else {
println!("Index 5 doesn't exist");
}
}
pub fn safe_string_operations() {
let mut dest = String::with_capacity(10);
let src = "This is a very long string that would overflow a fixed buffer";
dest.push_str(src);
println!("String length: {} (automatically managed)", dest.len());
}
pub fn demonstration_bounds_checking() {
let buffer: [u8; 10] = [0; 10];
let data: [u8; 20] = [1; 20];
let safe_copy = &data[..buffer.len()];
let mut mutable_buffer = buffer;
mutable_buffer.copy_from_slice(safe_copy);
println!("Safe copy completed: {:?}", mutable_buffer);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_safe_copy_success() {
let mut dest = [0u8; 10];
let src = [1, 2, 3, 4, 5];
assert!(safe_copy(&mut dest, &src).is_ok());
assert_eq!(&dest[..5], &src);
}
#[test]
fn test_safe_copy_overflow_prevented() {
let mut dest = [0u8; 5];
let src = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
assert!(safe_copy(&mut dest, &src).is_err());
}
#[test]
#[should_panic]
#[allow(unconditional_panic, clippy::out_of_bounds_indexing)]
fn test_out_of_bounds_panic() {
let array = [1, 2, 3];
let _ = array[10]; }
#[test]
fn test_safe_get() {
let array = [1, 2, 3];
assert_eq!(array.get(1), Some(&2));
assert_eq!(array.get(10), None); }
}