Comments (1)
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!
from rust-ascii.
Related Issues (20)
- Feature request: public iterator types
- Add AsciiCStr and AsciiCString types
- Add support for extended ascii HOT 2
- What is the intended behaviour of AsciiStr.lines()? HOT 2
- Implement `std::str::pattern::Pattern`
- Most functions could be const HOT 4
- Update quickcheck dependency to 0.8 HOT 7
- Publish next version to crate.io? HOT 1
- Implementing `From<&mut AsciiStr>` for `&mut str` and `&mut [u8]` is unsound HOT 8
- Mark AsciiStr `#[repr(transparent)]` ? HOT 2
- Versions 0.7.0-0.9.2 are yanked? HOT 1
- All files in crate are executables HOT 1
- AsciiChar::Caret documentation shows '_' HOT 1
- Easy way to get a &str or even just &AsciiStr out of [AsciiChar; _], &[AsciiChar; _] or &[AsciiChar] HOT 2
- AsciiChar::SOX should be AsciiChar::STX HOT 2
- Publish new version with the alloc feature? HOT 6
- Create `AsciiStr` from `str` using `const fn`
- Convert to and from AsciiString and Box<AsciiStr> HOT 1
- Benchmark HOT 2
- `serde_test` should be dev-dependency HOT 3
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 rust-ascii.