Nepříjemné je, že ten unsafe kód může záviset i na invariantech ze safe kódu (např. index do pole může spočítat safe kód), takže musíte dávat i pozor na safe kód. Respektive i změna v safe kódu pak může rozbít program.
Neptal jsem se posledně na nějakou ukázku? Bohužel si nevybavuji výsledek.
Příklad je na stránce Working with Unsafe, před odstavcem
This program is now unsound, Safe Rust can cause Undefined Behavior, and yet we only modified safe code. This is the fundamental problem of safety: it's non-local. The soundness of our unsafe operations necessarily depends on the state established by otherwise "safe" operations.
Děkuji za příspěvek.
Viděl bych tam následující problém:
fn index(idx: usize, arr: &[u8]) -> Option<u8> {
if idx <= arr.len() {
unsafe {
Some(*arr.get_unchecked(idx))
}
} else {
None
}
}
V tom unsafe kódu pracuji s proměnnou (
idx), která má špatný rozsah. Není nijak směrodatné, že kontroluju rozsah v safe části. (Naopak, je to rozumné, protože to bude v tomto případě jednodužší.) Ta kontrola je chybná, a díky tomu je chybné i chování unsafe části. Vstoupil jsem do unsafe části, čímž jsem si vypnul (některé) kontroly, a celkem jasně tam mám proměnnou, kterou si táhnu z vnějšího safe kontextu, a mám na něj nějaké předpoklady, tak bych si ty předpoklady měl jako programátor ověřit. Neudělal jsem to, chyba.
V tom druhém případě je to podobný princip.
Úplně v tom nevidím tu katastrofu, kterou v tom pozoruješ ty. Hmm.
V každém případě ta matematika nevychází.
Mám-li v kódu jednu chybu, tak mám v kódu jednu chybu. Je dost dobře jedno, jestli se projeví tady nebo tam. A ano, může se množit. Ale stále mám v kódu jednu chybu. Skutečnost, že se chyba projeví v safe Rust neznamená, že ta chyba je v této části. Opravovat ji musím tam, kde je. Ano, může to být složitější. Tak on Rust prostě je složitější.
Pokud přijmu tvé tvrzení, že unsafe Rust vyžaduje cca třikrát tolik kódu jak C, tak jakmile napíšu kód, kde bude poměr větší jak 3:1 Safe versus Unsafe, už jsem na tom lépe jak čistý C kód

Ano, psaní unsafe je třeba věnovat péči, ale nevidím v tom důvod přecházet na jazyk z kategorie unsafe by default. I kdyby ta péče měla být třikrát tak větší.