Merge remote-tracking branch 'origin/main'
This commit is contained in:
commit
6f31cf3fc2
9
4.2/2.md
9
4.2/2.md
@ -239,6 +239,15 @@ fn get_entities_at<T, const N: usize>(entities: &mut [T], indices: [usize; N]) -
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
Теперь гарантии происходят внутри самой функции.
|
Теперь гарантии происходят внутри самой функции.
|
||||||
|
Спустя некоторое время вашему коллеге поступило ТЗ, что эта функция должна выдавать индексы только по энтити, которые видимы (пускай будет трейт с методом is_visible). Изменим код:
|
||||||
|
**код**
|
||||||
|
Но останется ли такой код безопасным? Читающему код придётся снова разбирать, какие инварианты нужно соблюсти, чтобы код оставался безопасным. Но этого можно было бы избежать, если бы мы обозначали, какие инварианты мы соблюли. По примеру Safety у функций, у unsafe блоков обозначают соблюдены инварианты словом SAFETY:
|
||||||
|
```rust
|
||||||
|
**Kod**
|
||||||
|
```
|
||||||
|
Но, оно нужно не только для этого. При написании такого комментария программист лишний раз подумает, какие инварианты нужно соблюсти. А ещё, упрощает нахождение бага, так как можно сравнить условия, когда возникает баг, с теми условиями, что прописаны в комментариями. И баг по безопасности будет возникать возникать только в unsafe блоках. Правда, при всплытии в одном месте, причиной возникновения может стать unsafe блок в совершенно другом месте. Поэтому, хотелось бы сузить количество кода для поиска бага, поэтому старайтесь уменьшать блоки unsafe.
|
||||||
|
### Хорош тот unsafe, которого нет
|
||||||
|
Лучшее, что можно сделать с unsafe: это не писать его. Если ту же логику можно можно написать в safe rust, то пишите её в safe rust (разве что, можно как небольшое исключение сказать про случай, когда с unsafe мы можем получить хороший прирост производительности в критическом для производительности месте). Стоит что раз подумать, прежде чем писать unsafe код.
|
||||||
|
|
||||||
**Начать с проблемы, когда компилятор не может гарантировать безопасность по памяти (но без этого невозможно написать программу), возможно из ub**
|
**Начать с проблемы, когда компилятор не может гарантировать безопасность по памяти (но без этого невозможно написать программу), возможно из ub**
|
||||||
Допустим, на вход вашей функции
|
Допустим, на вход вашей функции
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user