Как справиться с «попыткой оставить тип linked_hash_map::Node неинициализированным» при использовании ящика hjson?
Я хочу использовать формат hjson в своей программе. Однако кажется, что ящик довольно старый. Обновленный форк находится по адресу https://github.com/shi-yan/hjson-rust, который я использовал в своей программе. Ниже моя тестовая программа.
# Cargo.toml
[dependencies]
hjson = { git = "https://github.com/shi-yan/hjson-rust", branch = "master" }
serde = "1.0.102"
serde-hjson = "0.9.1"
//! src/main.rs
use serde_hjson::{Value, Map};
fn main() {
let data = r###"
{
name: test3
tag : username, password
}
"###;
let mut xx: Map<String, Value> = serde_hjson::from_str(&data).unwrap();
}
Когда я запускаю его, я получаю следующую ошибку:
thread 'main' panicked at 'attempted to leave type `linked_hash_map::Node<alloc::string::String, value::Value>` uninitialized, which is invalid', C:\Users\user1\.cargo\registry\src\github.com-1ecc6299db9ec823\linked-hash-map-0.3.0\src\lib.rs:203:52
stack backtrace:
0: std::panicking::begin_panic_handler
at /rustc/4b91a6ea7258a947e59c6522cd5898e7c0a6a88f/library\std\src\panicking.rs:584
1: core::panicking::panic_fmt
at /rustc/4b91a6ea7258a947e59c6522cd5898e7c0a6a88f/library\core\src\panicking.rs:142
2: core::panicking::panic
at /rustc/4b91a6ea7258a947e59c6522cd5898e7c0a6a88f/library\core\src\panicking.rs:48
3: core::mem::uninitialized
at /rustc/4b91a6ea7258a947e59c6522cd5898e7c0a6a88f\library\core\src\mem\mod.rs:685
4: linked_hash_map::LinkedHashMap<alloc::string::String,enum$<serde_hjson::value::Value>,std::collections::hash::map::RandomState>::insert<alloc::string::String,enum$<serde_hjson::value::Value>,std::collections::hash::map::RandomState>
at C:\Users\user1\.cargo\registry\src\github.com-1ecc6299db9ec823\linked-hash-map-0.3.0\src\lib.rs:203
5: linked_hash_map::serde::impl$2::visit_map<alloc::string::String,enum$<serde_hjson::value::Value>,serde_hjson::de::MapVisitor<core::iter::adapters::map::Map<core::slice::iter::Iter<u8>,serde_hjson::de::from_iter::closure_env$2<core::iter::adapters::map::Ma
at C:\Users\user1\.cargo\registry\src\github.com-1ecc6299db9ec823\linked-hash-map-0.3.0\src\serde.rs:72
6: serde_hjson::de::Deserializer<core::iter::adapters::map::Map<core::slice::iter::Iter<u8>,serde_hjson::de::from_iter::closure_env$2<core::iter::adapters::map::Map<core::slice::iter::Iter<u8>,serde_hjson::de::from_slice::closure_env$0<linked_hash_map::Linke
at C:\Users\user1\.cargo\registry\src\github.com-1ecc6299db9ec823\serde-hjson-0.9.1\src\de.rs:151
7: serde_hjson::de::impl$1::deserialize<core::iter::adapters::map::Map<core::slice::iter::Iter<u8>,serde_hjson::de::from_iter::closure_env$2<core::iter::adapters::map::Map<core::slice::iter::Iter<u8>,serde_hjson::de::from_slice::closure_env$0<linked_hash_map
at C:\Users\user1\.cargo\registry\src\github.com-1ecc6299db9ec823\serde-hjson-0.9.1\src\de.rs:443
8: serde_hjson::de::impl$1::deserialize_map<core::iter::adapters::map::Map<core::slice::iter::Iter<u8>,serde_hjson::de::from_iter::closure_env$2<core::iter::adapters::map::Map<core::slice::iter::Iter<u8>,serde_hjson::de::from_slice::closure_env$0<linked_hash
at C:\Users\user1\.cargo\registry\src\github.com-1ecc6299db9ec823\serde-hjson-0.9.1\src\forward.rs:35
9: linked_hash_map::serde::impl$3::deserialize<alloc::string::String,enum$<serde_hjson::value::Value>,serde_hjson::de::Deserializer<core::iter::adapters::map::Map<core::slice::iter::Iter<u8>,serde_hjson::de::from_iter::closure_env$2<core::iter::adapters::map
at C:\Users\user1\.cargo\registry\src\github.com-1ecc6299db9ec823\linked-hash-map-0.3.0\src\serde.rs:88
10: serde_hjson::de::from_iter<core::iter::adapters::map::Map<core::slice::iter::Iter<u8>,serde_hjson::de::from_slice::closure_env$0<linked_hash_map::LinkedHashMap<alloc::string::String,enum$<serde_hjson::value::Value>,std::collections::hash::map::RandomState
at C:\Users\user1\.cargo\registry\src\github.com-1ecc6299db9ec823\serde-hjson-0.9.1\src\de.rs:813
11: serde_hjson::de::from_slice<linked_hash_map::LinkedHashMap<alloc::string::String,enum$<serde_hjson::value::Value>,std::collections::hash::map::RandomState> >
at C:\Users\user1\.cargo\registry\src\github.com-1ecc6299db9ec823\serde-hjson-0.9.1\src\de.rs:846
12: serde_hjson::de::from_str<linked_hash_map::LinkedHashMap<alloc::string::String,enum$<serde_hjson::value::Value>,std::collections::hash::map::RandomState> >
at C:\Users\user1\.cargo\registry\src\github.com-1ecc6299db9ec823\serde-hjson-0.9.1\src\de.rs:853
13: test3::main
at .\src\main.rs:13
14: core::ops::function::FnOnce::call_once<void (*)(),tuple$<> >
at /rustc/4b91a6ea7258a947e59c6522cd5898e7c0a6a88f\library\core\src\ops\function.rs:248
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
error: process didn't exit successfully: `target\debug\test3.exe` (exit code: 101)
Process finished with exit code 101
Я понятия не имею, что здесь происходит. Может ли кто-нибудь помочь мне?
1 ответ
Вкратце: версия, которую вы используете, ненадежна, иstd
преобразовал эту несостоятельность в панику.
Вы можете видеть, что паника возникает внутриstd::mem::uninitialized
. Эта паника показывает, что тип, который он пытался создать, имеет недопустимые битовые шаблоны (поскольку он содержит соответствующий ключ , который в вашем случае равен , иString
имеет ненулевое поле указателя), поэтому наличие неинициализированного значения этого типа является UB, что предотвращает паника. Вы ничего не можете сделать, оставаясь на тех же версиях зависимостей — это ошибка в .
Теперь, что вы можете сделать?
- Вы можете отключить
preserve-order
особенность , которая является причиной втягивания . Это делается с помощью следующей строки в вашемCargo.toml
:
serde-hjson = { version = "0.9.1", default-features = false }
В этом случае вы, очевидно, потеряете порядок ключей в своих картах, но я предполагаю, что это не так важно.
- Или вы можете перейти на развилку
serde_hjson
, использованnushell
- то есть на nu-json; он использует обновленную версиюlinked_hash_map
, который не имеет этой несостоятельности.