File tree Expand file tree Collapse file tree 1 file changed +32
-0
lines changed Expand file tree Collapse file tree 1 file changed +32
-0
lines changed Original file line number Diff line number Diff line change @@ -509,6 +509,38 @@ impl CStr {
509
509
/// The returned pointer will be valid for as long as `self` is and points
510
510
/// to a contiguous region of memory terminated with a 0 byte to represent
511
511
/// the end of the string.
512
+ ///
513
+ /// **WARNING**
514
+ ///
515
+ /// It is your responsibility to make sure that the underlying memory is not
516
+ /// freed too early. For example, the following code will cause undefined
517
+ /// behaviour when `ptr` is used inside the `unsafe` block:
518
+ ///
519
+ /// ```no_run
520
+ /// use std::ffi::{CString};
521
+ ///
522
+ /// let ptr = CString::new("Hello").unwrap().as_ptr();
523
+ /// unsafe {
524
+ /// // `ptr` is dangling
525
+ /// *ptr;
526
+ /// }
527
+ /// ```
528
+ ///
529
+ /// This happens because the pointer returned by `as_ptr` does not carry any
530
+ /// lifetime information and the string is deallocated immediately after
531
+ /// the `CString::new("Hello").unwrap().as_ptr()` expression is evaluated.
532
+ /// To fix the problem, bind the string to a local variable:
533
+ ///
534
+ /// ```no_run
535
+ /// use std::ffi::{CString};
536
+ ///
537
+ /// let hello = CString::new("Hello").unwrap();
538
+ /// let ptr = hello.as_ptr();
539
+ /// unsafe {
540
+ /// // `ptr` is valid because `hello` is in scope
541
+ /// *ptr;
542
+ /// }
543
+ /// ```
512
544
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
513
545
pub fn as_ptr ( & self ) -> * const c_char {
514
546
self . inner . as_ptr ( )
You can’t perform that action at this time.
0 commit comments