- 
                Notifications
    You must be signed in to change notification settings 
- Fork 13.9k
std: Implement CString-related RFCs #22482
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
Conversation
| r? @huonw (rust_highfive has picked a reviewer for you, use r? to override) | 
| r? @aturon | 
| Hm, I see you decided against introducing additional constructors. It seems like  | 
| Likewise  | 
| Also, did we want to consider #16035 here? | 
| I suppose that, since this doesn't stabilize the module now, we can do these other changes later on. Other than those, the PR LGTM (and I actually quite like how this played out in io). | 
| I'm a little worried about adding a large number of  I did in general yeah feel a little uncomfortable marking these changes as  To make progress on #16035 I think that we would need to  let ptr = opt_cstr.map(|s| s.as_ptr()).unwrap_or(0 as *const _);In general I'm pretty wary about #16035 due to our forays to "make unsafe APIs a little safer" largely being unsuccessful. I do agree, though, that if we do it now is the time. I would probably personally vote to not do it myself. | 
11b1916    to
    9f414ea      
    Compare
  
    9f414ea    to
    1860ee5      
    Compare
  
    This commit is an implementation of [RFC 592][r592] and [RFC 840][r840]. These two RFCs tweak the behavior of `CString` and add a new `CStr` unsized slice type to the module. [r592]: https://github.com/rust-lang/rfcs/blob/master/text/0592-c-str-deref.md [r840]: https://github.com/rust-lang/rfcs/blob/master/text/0840-no-panic-in-c-string.md The new `CStr` type is only constructable via two methods: 1. By `deref`'ing from a `CString` 2. Unsafely via `CStr::from_ptr` The purpose of `CStr` is to be an unsized type which is a thin pointer to a `libc::c_char` (currently it is a fat pointer slice due to implementation limitations). Strings from C can be safely represented with a `CStr` and an appropriate lifetime as well. Consumers of `&CString` should now consume `&CStr` instead to allow producers to pass in C-originating strings instead of just Rust-allocated strings. A new constructor was added to `CString`, `new`, which takes `T: IntoBytes` instead of separate `from_slice` and `from_vec` methods (both have been deprecated in favor of `new`). The `new` method returns a `Result` instead of panicking. The error variant contains the relevant information about where the error happened and bytes (if present). Conversions are provided to the `io::Error` and `old_io::IoError` types via the `FromError` trait which translate to `InvalidInput`. This is a breaking change due to the modification of existing `#[unstable]` APIs and new deprecation, and more detailed information can be found in the two RFCs. Notable breakage includes: * All construction of `CString` now needs to use `new` and handle the outgoing `Result`. * Usage of `CString` as a byte slice now explicitly needs a `.as_bytes()` call. * The `as_slice*` methods have been removed in favor of just having the `as_bytes*` methods. Closes rust-lang#22469 Closes rust-lang#22470 [breaking-change]
This commit is an implementation of [RFC 592][r592] and [RFC 840][r840]. These two RFCs tweak the behavior of `CString` and add a new `CStr` unsized slice type to the module. [r592]: https://github.com/rust-lang/rfcs/blob/master/text/0592-c-str-deref.md [r840]: https://github.com/rust-lang/rfcs/blob/master/text/0840-no-panic-in-c-string.md The new `CStr` type is only constructable via two methods: 1. By `deref`'ing from a `CString` 2. Unsafely via `CStr::from_ptr` The purpose of `CStr` is to be an unsized type which is a thin pointer to a `libc::c_char` (currently it is a fat pointer slice due to implementation limitations). Strings from C can be safely represented with a `CStr` and an appropriate lifetime as well. Consumers of `&CString` should now consume `&CStr` instead to allow producers to pass in C-originating strings instead of just Rust-allocated strings. A new constructor was added to `CString`, `new`, which takes `T: IntoBytes` instead of separate `from_slice` and `from_vec` methods (both have been deprecated in favor of `new`). The `new` method returns a `Result` instead of panicking. The error variant contains the relevant information about where the error happened and bytes (if present). Conversions are provided to the `io::Error` and `old_io::IoError` types via the `FromError` trait which translate to `InvalidInput`. This is a breaking change due to the modification of existing `#[unstable]` APIs and new deprecation, and more detailed information can be found in the two RFCs. Notable breakage includes: * All construction of `CString` now needs to use `new` and handle the outgoing `Result`. * Usage of `CString` as a byte slice now explicitly needs a `.as_bytes()` call. * The `as_slice*` methods have been removed in favor of just having the `as_bytes*` methods. Closes rust-lang#22469 Closes rust-lang#22470 [breaking-change]
This commit is an implementation of RFC 592 and RFC 840. These
two RFCs tweak the behavior of
CStringand add a newCStrunsized slice typeto the module.
The new
CStrtype is only constructable via two methods:deref'ing from aCStringCStr::from_ptrThe purpose of
CStris to be an unsized type which is a thin pointer to alibc::c_char(currently it is a fat pointer slice due to implementationlimitations). Strings from C can be safely represented with a
CStrand anappropriate lifetime as well. Consumers of
&CStringshould now consume&CStrinstead to allow producers to pass in C-originating strings instead of just
Rust-allocated strings.
A new constructor was added to
CString,new, which takesT: IntoBytesinstead of separate
from_sliceandfrom_vecmethods (both have beendeprecated in favor of
new). Thenewmethod returns aResultinstead ofpanicking. The error variant contains the relevant information about where the
error happened and bytes (if present). Conversions are provided to the
io::Errorandold_io::IoErrortypes via theFromErrortrait whichtranslate to
InvalidInput.This is a breaking change due to the modification of existing
#[unstable]APIsand new deprecation, and more detailed information can be found in the two RFCs.
Notable breakage includes:
CStringnow needs to usenewand handle the outgoingResult.CStringas a byte slice now explicitly needs a.as_bytes()call.as_slice*methods have been removed in favor of just having theas_bytes*methods.Closes #22469
Closes #22470
[breaking-change]