
180
이펙티브 러스트
의도하지 않은 동작 발생
// `idx` 지점에 있는 `Guest`의 등록을 취소하면
// 그 뒤에 나오는 방문자를 모두 위로 이동시킨다.
pub fn deregister(&mut self, idx: usize) -> Result<(), super::Error> {
if idx >= self.by_arrival.len() {
return Err(super::Error::new("out of bounds"));
}
self.by_arrival.remove(idx);
// 그런데 실수로 `by_name`을 업데이트하지 않았다.
Ok(())
}
이 버전에서는
Vec
을 이동시킬 수 있기 때문에
by
_
name
인덱스는 사실상 포인터처럼 작동한
다. 그래서 버그에 의해 이러한 ‘포인터’가 (
Vec
의 경계를 벗어나서 ) 아무것도 가리키지 않거
나 잘못된 데이터를 가리키는 안전하지 않은 세계로 되돌아가 버렸다.
의도하지 않은 동작 발생
ledger.register(alice);
ledger.register(bob);
ledger.register(charlie);
println!("Register starts as: {ledger:?}");
ledger.deregister(0).unwrap();
println!("Register after deregister(0): ...