Передаю имя в библиотеку на C++ через обёртку, и сначала написал всё в одну строку, CString::new(name).unwrap().as_ptr(), и rustc сразу предупредил, что временный CString умрёт в конце выражения и указатель будет висячим. Ладно, справедливо. Я вынес это в маленькую функцию, которая создаёт CString в локальной переменной и возвращает as_ptr(), и предупреждение пропало, и я почти успокоился, а потом сообразил, что ничего не изменилось, просто строка теперь умирает в конце функции, а не выражения.
use std::ffi::{c_char, CString};
fn name_ptr(s: &str) -> *const c_char {
let c = CString::new(s).unwrap();
c.as_ptr()
}
Это компилируется без единого предупреждения. Линт ловит временное значение в одном выражении, а связанную переменную, которая уходит из функции, не ловит, хотя в справке к самому предупреждению написано, что для возвращаемого указателя связывания внутри функции мало. А если сторона C++ ещё и сохраняет указатель у себя, а не только читает его во время вызова, то даже переменной в вызывающем коде не хватит, и я пока не знаю, что именно она делает, документации там почти нет. Решил пока держать CString в структуре-обёртке рядом с дескриптором, чтобы они жили одинаково, и посмотреть, что скажут.
