diff --git a/src/libstd/c_str.rs b/src/libstd/c_str.rs index 6e6aa9ad3faaf..ed7b9cdba2a72 100644 --- a/src/libstd/c_str.rs +++ b/src/libstd/c_str.rs @@ -161,17 +161,25 @@ impl CString { } /// Converts the CString into a `&str` without copying. - /// Returns None if the CString is not UTF-8 or is null. + /// Returns None if the CString is not UTF-8. + /// + /// # Failure + /// + /// Fails if the CString is null. #[inline] pub fn as_str<'a>(&'a self) -> Option<&'a str> { - if self.buf.is_null() { return None; } let buf = self.as_bytes(); let buf = buf.slice_to(buf.len()-1); // chop off the trailing NUL str::from_utf8(buf) } /// Return a CString iterator. + /// + /// # Failure + /// + /// Fails if the CString is null. pub fn iter<'a>(&'a self) -> CChars<'a> { + if self.buf.is_null() { fail!("CString is null!"); } CChars { ptr: self.buf, lifetime: unsafe { cast::transmute(self.buf) }, @@ -190,8 +198,14 @@ impl Drop for CString { } impl Container for CString { + /// Return the number of bytes in the CString (not including the NUL terminator). + /// + /// # Failure + /// + /// Fails if the CString is null. #[inline] fn len(&self) -> uint { + if self.buf.is_null() { fail!("CString is null!"); } unsafe { ptr::position(self.buf, |c| *c == 0) } @@ -561,8 +575,27 @@ mod tests { assert_eq!(c_str.as_str(), Some("")); let c_str = bytes!("foo", 0xff).to_c_str(); assert_eq!(c_str.as_str(), None); + } + + #[test] + #[should_fail] + fn test_as_str_fail() { let c_str = unsafe { CString::new(ptr::null(), false) }; - assert_eq!(c_str.as_str(), None); + c_str.as_str(); + } + + #[test] + #[should_fail] + fn test_len_fail() { + let c_str = unsafe { CString::new(ptr::null(), false) }; + c_str.len(); + } + + #[test] + #[should_fail] + fn test_iter_fail() { + let c_str = unsafe { CString::new(ptr::null(), false) }; + c_str.iter(); } }