Comments (5)
Great analysis! I'll take this bug, drop code is my fault anyway ;)
from miri.
@oli-obk Weird... the closure body ought to explicitly drop the closure environment argument in MIR.
from miri.
I figured out the problem here.
move || { let _ = x; };
never by-value uses any of its captures, so it's a closure whose inherent signature is fn(&self)
. When we call it through FnOnce::call_once
(in f(x)
), it has to use a shim.
Our shim acts like the following function, where self
is the closure type and body
is the closure fn:
fn call_once_shim(self) {
body(&self)
// NOTE: self should be dropped at the end of scope, but Miri doesn't do it.
}
As you can see in the shim code I linked above, we do add this self
to a vec of temporaries
to be freed when the stack frame is freed, but we don't ever execute the drop glue for it. (It's freed here.)
from miri.
Note that if you force the closure to by-value use a separate value to remove Miri's use of the shim, then the closure's drop glue is properly called, as in this test I added.
EDIT: Actually I think in that case the closure body itself will drop x
, since it's a fn(self)
signature closure, responsible for freeing the by-value self
argument which contains the capture x
.
EDIT 2: ...which I guess means the closure body executes the closure's drop glue, so I wasn't wrong, just imprecise. :P
from miri.
It would also be fixed once @arielb1's rewrite of these shims into explicit MIR bodies is done in rustc, but I'm not sure about the timeline on that. If it's hard to fix in Miri we can wait, otherwise it's fine to do it now.
EDIT: relevant rustc PR is here.
from miri.
Related Issues (20)
- Big `Vec::try_reserve` OOMs Miri (slowly) HOT 12
- Clearer error message for unsupported flags: print names of flags (if possible) HOT 1
- "local crate" detection does not work any more
- Stuck when running `cargo miri test` HOT 3
- ICE due to overflow when using a large timeout with futexes HOT 2
- Possible false positive of stacked borrow rules HOT 1
- simd_bitmask: support vectors larger than 64 elements
- Miri does not detect invalid uses of alchemy (std::ptr::from_raw_parts w/ invalid vtable pointer) HOT 5
- Implement blocking support for eventfd and socketpair HOT 6
- Memory-reusing custom allocator fails in miri HOT 1
- Use strict_{add,sub,...} instead of checked_{add,sub,...}.unwrap()
- Support setting Miri flags in the rustc file via attributes HOT 2
- Calling a method on `&mut Box<T>` is not detected as a Unique retag HOT 6
- mention MIRIFLAGS in unsupported operation error and --help HOT 1
- FreeBSD: clean up readdir_r
- Trying to allocate isize::MAX + 1 bytes ICEs Miri HOT 1
- Trying to SeekFrom::Start past i64::MAX ICEs Miri
- Attempting to allocate with alignment greater than 2^29 ICEs Miri HOT 1
- Remove dead Intel intrinsics
- ICE for wcslen on Windows HOT 9
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from miri.