Understanding memory and thread safety practices and issues in real-world Rust programs