Closed
Description
I tried this code:
use std::{cell::RefCell};
pub struct MessageListeners<'a> {
listeners: RefCell<Vec<Box<dyn FnMut(()) + 'a>>>
}
impl<'a> MessageListeners<'a> {
pub fn new()->Self {
MessageListeners { listeners: RefCell::new(Vec::new()) }
}
pub fn listen(&self, f: impl FnMut(())+'a) {
self.listeners.borrow_mut().push(Box::new(f));
}
pub fn send(&self, message: ()) {
for listener in self.listeners.borrow_mut().iter_mut() {
(*listener)(message.clone());
}
}
pub fn map(&self, f: impl Fn(())->())->MessageListeners<'a> {
let r = MessageListeners::new();
self.listeners().listen(|m| r.send(f(m)));
r
}
}
pub trait MessageListenersInterface {
fn listeners(&self)->&MessageListeners;
}
impl<'a> MessageListenersInterface for MessageListeners<'a> {
fn listeners<'b>(&'b self)->&'a MessageListeners<'b> {
self
}
}
#[test]
fn test_message_listeners_map0() {
let ml = MessageListeners::new();
let f = |m: ()| {};
let g = |m: ()| m;
ml.map(g).listen(f);
ml.send(());
}
#[test]
fn test_message_listeners_map2() {
let ml = MessageListeners::new();
let f = |m: ()| {};
let g = |m: ()| m;
let temp_variable=ml.map(g);
temp_variable.listen(f);
ml.send(());
}
I expected to see this happen: the two tests do the same thing
Instead, this happened: the first unit test SEG faults, the second succeeds
Meta
rustc --version --verbose
:
rustc 1.65.0 (897e37553 2022-11-02)
binary: rustc
commit-hash: 897e37553bba8b42751c67658967889d11ecd120
commit-date: 2022-11-02
host: aarch64-apple-darwin
release: 1.65.0
LLVM version: 15.0.0```
<!--
Include a backtrace in the code block by setting `RUST_BACKTRACE=1` in your
environment. E.g. `RUST_BACKTRACE=1 cargo build`.
-->
<details><summary>Backtrace</summary>
<p>
Caused by:
process didn't exit successfully: /Users/adamritter/Documents/GitHub/synced_collection/target/debug/deps/synccollection-9d89a83a383169be
(signal: 11, SIGSEGV: invalid memory reference)```
Metadata
Metadata
Assignees
Labels
Category: This is a bug.Issue: A soundness hole (worst kind of bug), see: https://en.wikipedia.org/wiki/SoundnessHigh priorityRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the types team, which will review and decide on the PR/issue.Performance or correctness regression from one stable version to another.