flowistry icon indicating copy to clipboard operation
flowistry copied to clipboard

[PDG] Strong updates to mutable references don't seem to work.

Open JustusAdam opened this issue 1 year ago • 1 comments

I tried code equivalent to this

let mut user_data = Vec::new();
user_data.push(0);
send(&user_data);

What I expected is that the vector connects to the first argument of push and then to the first argument of send. Instead there is an additional direct connection from the initial vector to the first argument of send.

The same actually happens with return values too.

let mut user_data = Vec::new();
let r = user_data.deref();
send(r);

This also has a direct connection between the vector and send, despite the code clearly always going through deref.

JustusAdam avatar Feb 01 '24 16:02 JustusAdam

Actually after some experimentation it sems to also happen with immutable references which is strange to me? This is the code I analyzed:

fn main() {
    let s = new_s();
    // 'a : 'b
    let t = deref_t(&s);
    read(t);
}

// Type signatures for external functions
fn deref_t(s: &S) -> &String;
fn read<T>(t: &T);
fn new_s() -> S;

The result has an edge from s to the first argument of read which I believe it shouldn't. It is not possible for any part of s to reach that place without passing through/being selected by deref_t.

JustusAdam avatar Feb 06 '24 23:02 JustusAdam