title: How do I free a *char allocated via FFI in Rust?
body: <p>I'm calling the LLVM API via Rust's FFI. <code>LLVMPrintModuleToString</code> <a href="http://llvm.org/docs/doxygen/html/Core_8cpp_source.html#l00205" rel="noreferrer">uses strdup to create a string</a>. However, when I wrap the pointer in a <code>CString</code>, I get an error when Rust drops it.</p>
  
  <pre><code>#![feature(cstr_memory)]
  use std::ffi::CString;
  
  extern crate llvm_sys as llvm;
  
  fn main() {
      let llvm_ir_cstring;
      unsafe {
          let module = llvm::core::LLVMModuleCreateWithName(b"nop\0".as_ptr() as *const _);
          let llvm_ir_char_ptr = llvm::core::LLVMPrintModuleToString(module);
          llvm::core::LLVMDisposeModule(module);
          llvm_ir_cstring = CString::from_ptr(llvm_ir_char_ptr);
      }
  
      println!("llvm_ir_cstring: {:?}", llvm_ir_cstring);
  }
  </code></pre>
  
  <p>Valgrind error:</p>
  
  <pre><code>==10413== Invalid read of size 4
  ==10413==    at 0x4870586: pthread_mutex_lock (in /usr/lib/libpthread-2.21.so)
  ==10413==    by 0x17F89B: je_arena_dalloc_small (in /home/wilfred/projects/bfc/target/debug/bfc)
  ==10413==    by 0x178C30: je_sdallocx (in /home/wilfred/projects/bfc/target/debug/bfc)
  ==10413==    by 0x10FA57: heap::imp::deallocate::h1fb92d59333c497bkja (heap.rs:268)
  ==10413==    by 0x10F999: heap::deallocate::h5680e3fedc9e96320da (heap.rs:89)
  ==10413==    by 0x10F929: heap::exchange_free::h452463f962f7ec23kfa (heap.rs:131)
  ==10413==    by 0x10F8C5: Box$LT$$u5b$u8$u5d$$GT$::drop.1769::haf7017472635c7cf (in /home/wilfred/projects/bfc/target/debug/bfc)
  ==10413==    by 0x10F836: std..ffi..c_str..CString::drop.1766::h04d2b3db8d468f0c (in /home/wilfred/projects/bfc/target/debug/bfc)
  ==10413==    by 0x10F5FF: main::h04b7feb343e229ccgaa (in /home/wilfred/projects/bfc/target/debug/bfc)
  ==10413==    by 0x16DBCA: rt::unwind::try::try_fn::h2403085009213705177 (in /home/wilfred/projects/bfc/target/debug/bfc)
  ==10413==    by 0x16FF5A: rust_try_inner (in /home/wilfred/projects/bfc/target/debug/bfc)
  ==10413==    by 0x16FF33: rust_try (in /home/wilfred/projects/bfc/target/debug/bfc)
  ==10413==  Address 0x1d684 is not stack'd, malloc'd or (recently) free'd
  </code></pre>
  
  <p>Why is this? What's the correct way to handle a <code>*char</code> from a C API?</p>