Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Crate doesn't build due to changes to rustc #7

Closed
tomprogrammer opened this issue Apr 18, 2015 · 1 comment
Closed

Crate doesn't build due to changes to rustc #7

tomprogrammer opened this issue Apr 18, 2015 · 1 comment
Assignees

Comments

@tomprogrammer
Copy link
Owner

In AsciiCast impl unconstrained lifetimes appear which were forbidden. (rust-lang/rust#24461)

Feel free to submit a PR.

@tomprogrammer tomprogrammer changed the title Crate doesn't build due to changes to std Crate doesn't build due to changes to rustc Apr 18, 2015
@tomprogrammer tomprogrammer self-assigned this Apr 18, 2015
@tomprogrammer
Copy link
Owner Author

This commit also fixes a bug in the unsafe code of AsciiCast implementations!

Prior to v0.4.1 it was possible to move or mutable borrow a variable after it has been borrowed by AsciiCast::to_ascii(). For example the following code compiled successfully:

fn lifetime() {
    let mut text = "some text".to_string();

    let ascii = text.to_ascii().unwrap();
    text.clear();
    drop(text);
    println!("{}", ascii);
}

This code borrows text mutably and even frees it's memory afterwards. We can then access ascii without complaints by the compiler! That clearly violates memory safety! (Try unsafe { text.as_mut_vec()[1] = 'i' as u8 } and you will likely see it prints "sime text")

The cause of this behavior is found in AsciiCast and it's implementations. The lifetime of the returned &'a AsciiStr is unconstrained and can exceed the lifetime of it's origin as it is unsafely transmuted.

In v0.4.1 the lifetimes are connected correctly and compiling the given piece of code errors out early:

src/lib.rs:749:9: 749:13 error: cannot borrow `text` as mutable because it is also borrowed as immutable
src/lib.rs:749         text.clear();
                       ^~~~
src/lib.rs:748:21: 748:25 note: previous borrow of `text` occurs here; the immutable borrow prevents subsequent moves or mutable borrows of `text` until the borrow ends
src/lib.rs:748         let ascii = text.to_ascii().unwrap();
                                   ^~~~
src/lib.rs:752:6: 752:6 note: previous borrow ends here
src/lib.rs:745     fn lifetime() {
...
src/lib.rs:752     }
                   ^
src/lib.rs:750:14: 750:18 error: cannot move out of `text` because it is borrowed
src/lib.rs:750         drop(text);
                            ^~~~
src/lib.rs:748:21: 748:25 note: borrow of `text` occurs here
src/lib.rs:748         let ascii = text.to_ascii().unwrap();
                                   ^~~~

I've found this bug thanks to @nikomatsakis changes to prohibit unconstrained lifetimes that appear in associated types. Unconstrained lifetimes are mostly a bad idea I guess!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant