Size: a a a

Rust — русскоговорящее сообществo

2020 December 01

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Igor Gulamov
Наткнулся на такую странную проблему при сборке no_std пакета:

```
Compiling sp-io v2.0.0
 error[E0152]: found duplicate lang item panic_impl
     --> /Users/snjax/.cargo/registry/src/github.com-1ecc6299db9ec823/sp-io-2.0.0/src/lib.rs:1277:1
      |
 1277 | pub fn panic(info: &core::panic::PanicInfo) -> ! {
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      |
      = note: the lang item is first defined in crate std (which num_traits depends on)
```

num_traits используется в proc-macro пакете только в кодогенерации. Разве импорты макросов могут как-то влиять на работу компилятора после препроцессинга?
По-моему это фиксится какими-то новысм анстейбл фичами карго, то ли resolver = 2, то ли -Zfeatures=что-то-там
источник

RP

Roman Proskuryakov in Rust — русскоговорящее сообществo
Igor Gulamov
Наткнулся на такую странную проблему при сборке no_std пакета:

```
Compiling sp-io v2.0.0
 error[E0152]: found duplicate lang item panic_impl
     --> /Users/snjax/.cargo/registry/src/github.com-1ecc6299db9ec823/sp-io-2.0.0/src/lib.rs:1277:1
      |
 1277 | pub fn panic(info: &core::panic::PanicInfo) -> ! {
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      |
      = note: the lang item is first defined in crate std (which num_traits depends on)
```

num_traits используется в proc-macro пакете только в кодогенерации. Разве импорты макросов могут как-то влиять на работу компилятора после препроцессинга?
ты импортишь num_traits, сделай ему в Карго.томл no-default-features
источник

RP

Roman Proskuryakov in Rust — русскоговорящее сообществo
crate_name = { version = "xyz", default-features = false }
источник

IG

Igor Gulamov in Rust — русскоговорящее сообществo
проблема в том, что это не единственный std пакет в proc-macro пакетах, используемых при сборке.
источник

IG

Igor Gulamov in Rust — русскоговорящее сообществo
скорее всего в этом частном случае проблема будет решена. Но в каких-то случаях сможет проявиться
источник

r

red75prime in Rust — русскоговорящее сообществo
Igor Gulamov
проблема в том, что это не единственный std пакет в proc-macro пакетах, используемых при сборке.
А он точно транзитивной зависимостью не идёт? cargo tree что говорит?
источник

IG

Igor Gulamov in Rust — русскоговорящее сообществo
я так понял, зависимость от num_traits есть в sp-io, и компилятор складывает фичи из для num_traits из proc-macro и пакета в sp-io, в результате ломает сборку sp-io с no_std
источник

IG

Igor Gulamov in Rust — русскоговорящее сообществo
переименование пакета поможет?
num-traits-for-macro = {package = "num-traits"}
источник

K

Kitsu in Rust — русскоговорящее сообществo
Можно как-нибудь у типа с дропом смувить поле без дропа?
Пока в голову идет только struct T(Option<Inner>) и ManuallyDrop::new(obj).0.take().unwrap(), но мб без опшна можно как-нибудь?
источник

С

Сергей in Rust — русскоговорящее сообществo
Kitsu
Можно как-нибудь у типа с дропом смувить поле без дропа?
Пока в голову идет только struct T(Option<Inner>) и ManuallyDrop::new(obj).0.take().unwrap(), но мб без опшна можно как-нибудь?
Ты представь, что в середине стека под это поле выделена память. Как ты хочешь ей распорядиться при дропе? В случае с опшеном ты поставишь None, а без него?
источник

K

Kitsu in Rust — русскоговорящее сообществo
Kitsu
Можно как-нибудь у типа с дропом смувить поле без дропа?
Пока в голову идет только struct T(Option<Inner>) и ManuallyDrop::new(obj).0.take().unwrap(), но мб без опшна можно как-нибудь?
Тэкс, в таком варианте даж ManuallyDrop не нужен кстати, вот хотелось бы без опшна но с ним
источник

K

Kitsu in Rust — русскоговорящее сообществo
Сергей
Ты представь, что в середине стека под это поле выделена память. Как ты хочешь ей распорядиться при дропе? В случае с опшеном ты поставишь None, а без него?
let mut t = T(Inner);
let inner = std::mem::replace(&mut t.0, std::mem::zeroed());
std::mem::forget(t);

Тут какбэ УБ, но в целом что-то такое должно быть
источник

С

Сергей in Rust — русскоговорящее сообществo
Через union может сработать, но тоже будет UB и unsafe, если случайно используешь после дропа
источник

V

Vladimir in Rust — русскоговорящее сообществo
Kitsu
let mut t = T(Inner);
let inner = std::mem::replace(&mut t.0, std::mem::zeroed());
std::mem::forget(t);

Тут какбэ УБ, но в целом что-то такое должно быть
ptr::read / https://doc.rust-lang.org/std/mem/struct.ManuallyDrop.html#method.take
А мануал дроп и так забудется, зачем ещё форгет?
источник

K

Kitsu in Rust — русскоговорящее сообществo
Vladimir
ptr::read / https://doc.rust-lang.org/std/mem/struct.ManuallyDrop.html#method.take
А мануал дроп и так забудется, зачем ещё форгет?
forget = ManuallyDrop, это был пример на вопрос "что должно происходить"
мне нужно смувить значение, а не скопировать как это сделает ptr::read
ну и после ManuallyDrop::into_inner`/`take по факту все равно будет вызван дроп, а мне это не нужно
источник

K

Kitsu in Rust — русскоговорящее сообществo
по факту было бы хорошо иметь какой-нибудь ManuallyDrop::map, чтоб получить вложенное значение и далее вызвать into_inner
источник

r

red75prime in Rust — русскоговорящее сообществo
Kitsu
forget = ManuallyDrop, это был пример на вопрос "что должно происходить"
мне нужно смувить значение, а не скопировать как это сделает ptr::read
ну и после ManuallyDrop::into_inner`/`take по факту все равно будет вызван дроп, а мне это не нужно
После move out память под исходное значение можно считать неинициализированной. А единственный способ иметь переменную, содержащую неинициализированную память без UB - это MaybeUninit.
источник

K

Kitsu in Rust — русскоговорящее сообществo
гмм, хороший поинт, да
видимо остановлюсь на изначальном варианте с option
источник

r

red75prime in Rust — русскоговорящее сообществo
В найтли есть assume_init_mut и assume_init_read, с ними можно было бы сделать.
источник

L

Lev in Rust — русскоговорящее сообществo
Как выяснить, выполнение каких функций занимает сколько суммарно времени при выполнении программы (кажется, это называется профайлинг)?
источник