2016-06-24 7 views
4

Попытка использовать JACK-AUDIO-CONNECTION-KIT от ржавчины (documentation), я столкнулся с проблемами, призывающихJack аудио имя клиента больше, чем 4-х символов ломает клиент

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

ржавчиной Я использую

#[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. Почему это происходит?

ответ

6

let name = CString::new("yass").unwrap().as_ptr(); выделяет строку, получает указатель на нее ... затем выбрасывает строку, поэтому вы получаете возможность использования после освобождения. Не делай этого. Напишите let name = CString::new("yass").unwrap();, затем используйте name.as_ptr(). См. Также CStr::as_ptr и this Предложение RFC.

Любые предложения по улучшению документации приветствуются.

+0

Теперь имеет смысл, спасибо! Предупреждение в документах хорошее. Из предложения RFC кажется, что многие новички (как и я) борются с этим. Было бы разумно «поощрять» пользователей к использованию соглашения об именах для необработанных указателей, то есть выдавать предупреждение, если исходные указатели не заканчиваются на «* _ptr». Возможно, в конечном итоге это увеличит бдительность в отношении правильного управления памятью и побудит людей не полагаться на компилятор на ошибку, если что-то не так. Более продвинутые люди могут отключить предупреждение. – poidl