պլհկ
ну да ладно
պլհկ
тут же спецы по бенчмаркам
Ма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?
Маjко
պլհկ
Vladimir
я юзал
Именно rust-protobuf, или другие либы получше будут?
Можно ли поверх него написать протокол, который будет обрабатывать только схемы с required полями?
И ругаясь на дополнительные?
պլհկ
я юзал rust-protobuf, это боль (говорят еще что медленно, но мне было некритично)
պլհկ
карлуха в тауэре юзает prost
պլհկ
если хочешь required поля, то в протобуфе делать нечего (это противоречит их философии)
Vladimir
А где есть что?
պլհկ
задача-то какая?
Vladimir
Нужен формат с схемой и реквайред полями
Vladimir
с поддержкой жавы
Vladimir
Вообще идеально было бы чтобы данные переживали цикл десериализации - сериализации в неизменном виде
Vladimir
при этом конечно, исходные данные может формировать злоумышленник
պլհկ
ну можешь глянуть capnproto
Loo
Vladimir
Глядел, у него ошибки "ленивые"
պլհկ
но там тоже нет required, и гемор примерно тот же
Kerrigan
Kerrigan
я про prost
Vladimir
с capnproto начал, кроме того что там можно нулевыми указателями дописать кучу байт, и в итоге исходный буффер будет другим после цикла десериализации - сериализации, так еще и ошибку нужно при обращении к каждому полю хендлить - тот еще гемор
պլհկ
так и в протобуфе то же самое
Roma
պլհկ
required в proto2 только
Roma
в avro кмк получше эволюция продумана
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]
Αλεχ
Αλεχ
сделал опять через memset сишный
Маjко
Будет медленнее по идее
Маjко
memset как функция по дефолту медленнее мемсета как инстринсик компилятора
Маjко
gcc/clang юзают интринсики для этого
Маjко
Потому что либцшный мемсет фоллбекается до минимальных требований x86_64, а интринсик может использовать фишечки новых процов
Маjко
Поправьте, если я заблуждаюсь
պլհկ
Сишный может в рантайме чекнуть фичи и юзать что угодно
պլհկ
Делает ли он это - надо смотреть
Αλεχ
в общем оверхеда он никакого не дает, вернул mem:;zeroed
Маjко
պլհկ
Один раз
Маjко
Почему один, а не при каждом вызове?
պլհկ
Потому что можно переписать пойнтер на нужную реализацию?
պլհկ
Ядро так делает
Маjко
Логично
Αλεχ
можно просто положиться на бранч предиктор в любом случае
Berkus
да зачем, один раз выбирается вариант мемсета при старте и всё