պլհկ
ну да ладно
պլհկ
тут же спецы по бенчмаркам
Маjко
Я не утверждал что помню libc x)
Αλεχ
нашел
Αλεχ
fdopen
Αλεχ
պլհկ
https://play.rust-lang.org/?gist=6f2a2e34dedac3e40ec36b6cd711e2cf&version=stable&mode=debug
պլհկ
не ту ссылку скинул, сорян
Маjко
Я вот не уверен что extern libc не тянет с крейтсов ничего. ЕМНИП, встроенная libc как крейт это найтли-фича
Маjко
Но это было давно
Αλεχ
чет не хочет
Berkus
гмм.. а если я хочу заимпельментить трейт для какой-то структуры не в моем крейте, чо мне лучше сделать, как это обернуть?
Αλεχ
const STDIN_FILENO: i32 = 0; const STDOUT_FILENO: i32 = 1; enum FILE {} extern { fn printf(fmt: *const u8, ...) -> i32; fn fgets(buf: *mut u8, n: i32, stream: *mut FILE) -> *mut u8; fn fdopen(fd: i32, mode: *const u8) -> *mut FILE; } fn main() { let mut chars: [u8; 11] = unsafe { std::mem::zeroed() }; unsafe { let file = fdopen(STDIN_FILENO, "r".as_ptr()); if fgets(chars.as_mut_ptr(), chars.len() as i32, file) == std::ptr::null_mut() { return; } let str = format!("Readed from input, value is {:?}.\n\0", chars); printf(str.as_ptr()); }; }
պլհկ
что не хочет?
Αλεχ
он в return уходит
red75prime
"r".as_ptr() - это не ноль-терминированная строка
պլհկ
Readed from input, value is [112, 111, 111, 107, 10, 0, 0, 0, 0, 0, 0].
Αλεχ
сишечка, как я скучал по этим "умвр"
պլհկ
у принтф сигнатура неправильная, сомневаюсь что будет работать
Berkus
Readed
Vladimir
Кто-то юзал rust-protobuf?
Vladimir
я юзал
Именно rust-protobuf, или другие либы получше будут? Можно ли поверх него написать протокол, который будет обрабатывать только схемы с required полями? И ругаясь на дополнительные?
պլհկ
я юзал rust-protobuf, это боль (говорят еще что медленно, но мне было некритично)
պլհկ
карлуха в тауэре юзает prost
պլհկ
если хочешь required поля, то в протобуфе делать нечего (это противоречит их философии)
Vladimir
А где есть что?
պլհկ
задача-то какая?
Vladimir
Нужен формат с схемой и реквайред полями
Vladimir
с поддержкой жавы
Vladimir
Вообще идеально было бы чтобы данные переживали цикл десериализации - сериализации в неизменном виде
Vladimir
при этом конечно, исходные данные может формировать злоумышленник
պլհկ
ну можешь глянуть capnproto
Vladimir
Глядел, у него ошибки "ленивые"
պլհկ
но там тоже нет required, и гемор примерно тот же
պլհկ
и как оно?
я-то не юзаю tower
Kerrigan
я про prost
Vladimir
с capnproto начал, кроме того что там можно нулевыми указателями дописать кучу байт, и в итоге исходный буффер будет другим после цикла десериализации - сериализации, так еще и ошибку нужно при обращении к каждому полю хендлить - тот еще гемор
պլհկ
так и в протобуфе то же самое
Roma
если хочешь required поля, то в протобуфе делать нечего (это противоречит их философии)
required же есть там, просто обычно не используют, так как менять схему сложно
պլհկ
required в proto2 только
Roma
в avro кмк получше эволюция продумана
Vladimir
required в proto2 только
там тоже есть optional =(
Vladimir
так и в протобуфе то же самое
в нем хоть ошибки сразу хендлятся, формат не ленивый же
Berkus
thrift не умеет?
Αλεχ
А как занулить массив можно?
Αλεχ
без перевыделения памяти?
Αλεχ
mem::zeroed вроде выделяет
Маjко
Ты не можешь выделять сразу зануленный?
Αλεχ
мне надо занулить буфер
Αλεχ
чтобы в нем мусора не осталось
Маjко
https://users.rust-lang.org/t/secure-memset-in-pure-stable-rust/7978
Маjко
https://github.com/quininer/memsec
Маjко
/// General `memset`. #[cfg(feature = "nightly")] #[cfg(any(not(apple), not(feature = "use_os")))] #[inline(never)] pub unsafe fn memset(s: *mut u8, c: u8, n: usize) { core::intrinsics::volatile_set_memory(s, c, n); }
Маjко
Унсейф потому что небезопасно мемсетить массив любого T
Маjко
Для красоты можно сделать свой сейфный трейт ZeroMem и реализовать его для &mut [u8/16/32/64/whatever]
Vladimir
thrift не умеет?
он поидее как протобаф
Αλεχ
сделал опять через memset сишный
Маjко
Будет медленнее по идее
Маjко
memset как функция по дефолту медленнее мемсета как инстринсик компилятора
Маjко
gcc/clang юзают интринсики для этого
Маjко
Потому что либцшный мемсет фоллбекается до минимальных требований x86_64, а интринсик может использовать фишечки новых процов
Маjко
Поправьте, если я заблуждаюсь
պլհկ
Сишный может в рантайме чекнуть фичи и юзать что угодно
պլհկ
Делает ли он это - надо смотреть
Αλεχ
в общем оверхеда он никакого не дает, вернул mem:;zeroed
պլհկ
Один раз
Маjко
Почему один, а не при каждом вызове?
պլհկ
Потому что можно переписать пойнтер на нужную реализацию?
պլհկ
Ядро так делает
Маjко
Логично
Αλεχ
можно просто положиться на бранч предиктор в любом случае
Berkus
да зачем, один раз выбирается вариант мемсета при старте и всё