pub fn reallocate(&mut self, ptr: MemoryPointer, old_size: u64, old_align: u64, new_size: u64, new_align: u64, kind: Kind) -> EvalResult<'tcx, MemoryPointer> {
use std::cmp::min;
- if ptr.offset != 0 || self.get(ptr.alloc_id).is_err() {
+ if ptr.offset != 0 {
return Err(EvalError::ReallocateNonBasePtr);
}
if let Ok(alloc) = self.get(ptr.alloc_id) {
}
pub fn deallocate(&mut self, ptr: MemoryPointer, size_and_align: Option<(u64, u64)>, kind: Kind) -> EvalResult<'tcx> {
- if ptr.offset != 0 || self.get(ptr.alloc_id).is_err() {
+ if ptr.offset != 0 {
return Err(EvalError::DeallocateNonBasePtr);
}
--- /dev/null
+#![feature(alloc, allocator_api)]
+
+extern crate alloc;
+
+use alloc::heap::Heap;
+use alloc::allocator::*;
+
+// error-pattern: dangling pointer was dereferenced
+
+use alloc::heap::*;
+fn main() {
+ unsafe {
+ let x = Heap.alloc(Layout::from_size_align_unchecked(1, 1)).unwrap();
+ Heap.dealloc(x, Layout::from_size_align_unchecked(1, 1));
+ Heap.realloc(x, Layout::from_size_align_unchecked(1, 1), Layout::from_size_align_unchecked(1, 1));
+ }
+}