@rhapsodhy
Startupok Rust + Security
https://ingraind.org https://github.com/rsdy/zerostash
Microsoft: a biztonsági rések 70%-at memóriakezelési hibák okozzák
Google Chrome: tényleg annyi
use after free, buffer overflow, double free, memory race
Próbáltál mar Python/JavaScript unit teszteket irni?
C++-ban vagy Java-ban sem sokkal jobb a helyzet
Próbáltál mar Python/JavaScript unit teszteket irni?
C++-ban vagy Java-ban sem sokkal jobb a helyzet
Biztonság: ✓
Kényelem: ¯\_ಠ_ಠ_/¯
Validáció: /m\
“most már két problémád van”
A GC algoritmusokat a környezetre kell hangolni, “GC pause”
Go-ban 10GB haszontalan memóriát allokálsz
Java-ban 10 millió paramétert írsz a run.sh-ba
“Az értelmetlen állapotokat nem tudjuk a programkódban kifejezni”
GC helyett RAII: “Resource acquisition is initialization”
Data race ellen élethossz típusparaméterek
Biztonság: ✓
Kényelem: ✓
Validáció: ✓
LLVM, rustc
A cargo mindenre jó
Amire nem, arra van xargo
- Cortex-M, foleg
–target=x86_64-unknown-linux-musl –target=armv7a-none-eabihf
struct Point { x: i32, y: i32, z: i32 }
fn main() { let mut point = Point { x: 0, y: 0, z: 0 };
let borrowed = &point;
// ez nem megy csinalj_valami_okosat(&mut borrowed);
// ez sem valami_okosabbat(point); }
// tuple struct struct Point (i32, i32, i32 )
// struct struct Point { x: i32, y: i32, z: i32 }
// sum type: null ertek nincs enum Result<T, E> { Ok(T) Err(E), }
// magyar webre magyar tipust type Pont = Point;
// nincs null
Ruby/Python mixin Haskell typeclass Java interface
trait Stream<T> { fn next() -> T; }
impl<T> Stream<T> for Vec<T> where T: Serialize { fn next() -> T { … } }
pub fn read_json<T>(filename: impl AsRef<Path>) -> T { serde_json::from_reader(File::open(filename.as_ref()).unwrap()).unwrap() }
Mivel nincsenek null értékek, ezért a Result/Option monadból ki kell szedni az értékeket
.unwrap().unwrap().unwrap()
? operátor nyelvi elem
pub fn commit_database(&mut self) -> Result<()> { let mut objstore = objects::Storage::get(self.backend.clone(), self.master_key.get_object_crypto()?);
objstore.commit(); Ok(()) }
async fn notify_start(client: &reqwest::Client) { let res = client .post(“https://api.sendgrid.com/v3/mail/send”) .json(&json!( * blablabla * )) .send() .await;
match res { Err(e) => status_err!(“failed to send email: {}”, e), Ok(_) => (), } }
cargo nélkul nehéz életre kelteni a fejlesztőkörnyezetet ==> Ennek megfelelően a cargo köré épült közösség a meghatározó
crates.io centralizált, és a GitHubon él
Bootstrappelt, Rustban írt fordító ==> Trusting (T)Rust?
Kérdések