【问题标题】:Jack audio client name longer than 4 characters breaks clientJack 音频客户端名称超过 4 个字符会破坏客户端
【发布时间】:2016-10-26 16:54:53
【问题描述】:

尝试使用 Rust (documentation) 的 JACK-AUDIO-CONNECTION-KIT,调用时遇到问题

jack_client_t* jack_client_open (   const char *    client_name,
                                    jack_options_t  options,
                                    jack_status_t *     status,
                                    ... )   

在 Rust 中我使用

#[link(name = "jack")]
extern "C" {
    pub fn jack_client_open(name: *const libc::c_char,
                        options: JackOptions,
                        status: &JackStatus)
                        -> *mut JackClientT;
}

(complete code)

当我使用带有四个字符的name 时,它可以工作,例如

let name = CString::new("yass").unwrap().as_ptr();

但如果我使用 5 个或更多字符,它就不起作用。在上面链接的 JACK 文档中,它说名称最多可以是 int jack_client_name_size() 个字符长,在我的例子中是 64 个字符。为什么会这样?

【问题讨论】:

    标签: rust ffi jack


    【解决方案1】:

    let name = CString::new("yass").unwrap().as_ptr(); 分配一个字符串,获取一个指向它的指针...然后丢弃该字符串,因此您获得了 use-after-free。不要这样做。写let name = CString::new("yass").unwrap();,然后使用name.as_ptr()。另请参阅 CStr::as_ptrthis RFC 提案。

    欢迎提出任何改进文档的建议。

    【讨论】:

    • 现在明白了,谢谢!文档中的警告很好。从 RFC 提案看来,许多初学者(像我一样)都在为此苦苦挣扎。 “鼓励”用户使用原始指针的命名约定是否有意义,即如果原始指针不以“*_ptr”结尾,则发出警告。也许从长远来看,这会提高对正确内存管理的警觉性,并且会提示人们在出现问题时不要依赖编译器来出错。更高级的人可以禁用警告。
    猜你喜欢
    • 2020-05-15
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    相关资源
    最近更新 更多