Size: a a a

2020 December 24

b

in Rust Beginners
этот код для того, чтобы объяснить мой вопрос, это не реализация
источник

MB

Mikail Bagishov in Rust Beginners
но меня больше волнует вопрос по поводу памяти, если это будет библиотека и вызываться из ++ , не затронет ли главное приложение память либы и наоборот? по-сути ведь этого не должно произойти?
ну что значит затронет? Скорее всего они будут пользоваться одной и той же кучей. Но если в них нет UB и подобных гадостей, то они будут мирно сосуществовать
источник

MB

Mikail Bagishov in Rust Beginners
Главное - четко отслеживать, что память освобождается в том же языке, что и выделяется
источник

MB

Mikail Bagishov in Rust Beginners
Что будет в противном случае я не очень уверен
источник

/

/bin/cat in Rust Beginners
Может быть поменять *mut Test на NonNull<Test>? Он прозрачный для FFI
источник

MB

Mikail Bagishov in Rust Beginners
/bin/cat
Может быть поменять *mut Test на NonNull<Test>? Он прозрачный для FFI
А зачем?
источник

/

/bin/cat in Rust Beginners
нет ансейфа
источник

MB

Mikail Bagishov in Rust Beginners
Тут вопрос выходит только в том, что плюсовый код не должен вызывать фунцкию с неправильным указателем, а не то будет UB. Но в плюсовом коде это довольно-таки нормально, не уверен что тут что-то надо фиксить
источник

MB

Mikail Bagishov in Rust Beginners
/bin/cat
нет ансейфа
FFI это заведомо ансейф. Просто ты перекладываешь чуть больше ответственности на вызывающий код.
источник

/

/bin/cat in Rust Beginners
в плюсовом коде можно взять по ссылке
источник

MB

Mikail Bagishov in Rust Beginners
/bin/cat
в плюсовом коде можно взять по ссылке
которая спокойно может провисать
источник

/

/bin/cat in Rust Beginners
но вроде в раст нет такого понятия как extern "CXX"
источник

MB

Mikail Bagishov in Rust Beginners
Mikail Bagishov
FFI это заведомо ансейф. Просто ты перекладываешь чуть больше ответственности на вызывающий код.
А еще так немного сдвинется место, где возникает UB. Оно теперь произойдет не при разыменовании указателя, а при вызове функции. Но кажется это совершенно несущественно.
источник

/

/bin/cat in Rust Beginners
Mikail Bagishov
которая спокойно может провисать
если код не будет экспортировать FFI методы, то почему нет?
источник

/

/bin/cat in Rust Beginners
обернуть все это в объект
источник

MB

Mikail Bagishov in Rust Beginners
/bin/cat
если код не будет экспортировать FFI методы, то почему нет?
не понял.
Ты не можешь на стороне плюсов сделать "сейфовую" обертку для вышеупомянутой функции, она заведомо будет ансейфной.
источник

MB

Mikail Bagishov in Rust Beginners
А если потом оборачивать в сейфовую обертку, то уже и не важно, как сам экстерн задекларирован
источник

MB

Mikail Bagishov in Rust Beginners
И еще кстати я тут об одном вспомнил:
// Rust:
extern "C" fn foo(x: &mut i32);
// C++:
extern {
   void foo(int&);
};
Не случится ли тут так, что плюсовый strict aliasing rule отравит растовый код?
источник

b

in Rust Beginners
Я погуглил и так понял, что мне следует добавить в test_hello Option<mut *Test> для проверки на null
источник

MB

Mikail Bagishov in Rust Beginners
Я погуглил и так понял, что мне следует добавить в test_hello Option<mut *Test> для проверки на null
То есть эту функцию допустимо вызывать с nullptr?

Тогда нужно брать Option<NonNull<Test>>
источник