rust_memory_safety_examples/
buffer_overflow_prevention.rs1pub fn safe_copy(dest: &mut [u8], src: &[u8]) -> Result<(), &'static str> {
30 if dest.len() < src.len() {
31 return Err("Destination buffer too small");
32 }
33
34 dest[..src.len()].copy_from_slice(src);
35 Ok(())
36}
37
38pub fn safe_array_access() {
40 let array = [1, 2, 3, 4, 5];
41
42 let _first = array[0]; match array.get(10) {
50 Some(value) => println!("Value: {}", value),
51 None => println!("Index out of bounds (safely handled)"),
52 }
53}
54
55pub fn safe_vector_usage() {
57 let mut vec = Vec::new();
58 vec.push(1);
59 vec.push(2);
60 vec.push(3);
61
62 for item in &vec {
64 println!("{}", item);
65 }
66
67 if let Some(value) = vec.get(5) {
69 println!("Value at index 5: {}", value);
70 } else {
71 println!("Index 5 doesn't exist");
72 }
73}
74
75pub fn safe_string_operations() {
77 let mut dest = String::with_capacity(10);
78 let src = "This is a very long string that would overflow a fixed buffer";
79
80 dest.push_str(src);
82
83 println!("String length: {} (automatically managed)", dest.len());
84}
85
86pub fn demonstration_bounds_checking() {
88 let buffer: [u8; 10] = [0; 10];
89 let data: [u8; 20] = [1; 20];
90
91 let safe_copy = &data[..buffer.len()];
96 let mut mutable_buffer = buffer;
97 mutable_buffer.copy_from_slice(safe_copy);
98
99 println!("Safe copy completed: {:?}", mutable_buffer);
100}
101
102#[cfg(test)]
103mod tests {
104 use super::*;
105
106 #[test]
107 fn test_safe_copy_success() {
108 let mut dest = [0u8; 10];
109 let src = [1, 2, 3, 4, 5];
110
111 assert!(safe_copy(&mut dest, &src).is_ok());
112 assert_eq!(&dest[..5], &src);
113 }
114
115 #[test]
116 fn test_safe_copy_overflow_prevented() {
117 let mut dest = [0u8; 5];
118 let src = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
119
120 assert!(safe_copy(&mut dest, &src).is_err());
122 }
123
124 #[test]
125 #[should_panic]
126 #[allow(unconditional_panic)]
127 fn test_out_of_bounds_panic() {
128 let array = [1, 2, 3];
129 let _ = array[10]; }
131
132 #[test]
133 fn test_safe_get() {
134 let array = [1, 2, 3];
135 assert_eq!(array.get(1), Some(&2));
136 assert_eq!(array.get(10), None); }
138}