vault backup: 2025-11-17 10:43:18
This commit is contained in:
parent
b988da37a6
commit
c5a490c5d4
32
4.2/2.md
32
4.2/2.md
@ -47,18 +47,48 @@ ub: из-за различий архитектру цп и ос и для оп
|
|||||||
|
|
||||||
|
|
||||||
# Start
|
# Start
|
||||||
В прошлом уроке мы научились использовать C функции в своем rust коде.
|
В прошлом уроке мы научились использовать C функции в своем rust коде. Давайте же расширим свои знания, и научимся взаимодействовать с таким кодом. В прошлом уроке в практическом задании вам встречался такой код:
|
||||||
|
```rust
|
||||||
|
include!(concat!(env!("OUT_DIR"), "/bindgen.rs"));
|
||||||
|
|
||||||
|
use std::ffi::{CStr, CString};
|
||||||
|
|
||||||
|
const TEST_JSON: &CStr = c"{
|
||||||
|
\"meaning_of_life\": 42
|
||||||
|
}";
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let json: *mut cJSON = unsafe { cJSON_Parse(TEST_JSON.as_ptr()) };
|
||||||
|
|
||||||
|
let json_str = unsafe { cJSON_PrintUnformatted(json) };
|
||||||
|
let json_str = unsafe { CString::from_raw(json_str) };
|
||||||
|
let json_str = json_str.to_str().unwrap();
|
||||||
|
assert_eq!(json_str, r#"{"meaning_of_life":42}"#);
|
||||||
|
|
||||||
|
let meaning_of_life = unsafe { cJSON_GetObjectItem(json, c"meaning_of_life".as_ptr()) };
|
||||||
|
let meaning_of_life = unsafe { cJSON_GetNumberValue(meaning_of_life) };
|
||||||
|
println!("Meaning of life: {}", meaning_of_life);
|
||||||
|
assert_eq!(meaning_of_life, 42f64);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
У json обозначен не встречавшийся до этого тип `*mut _`
|
||||||
|
## Указатели
|
||||||
|
Вы уже неоднократно пользовались референсами в своем коде. В этих типах компилятор следит за временем жизни, чтобы не обратится к памяти после освобождения, а так же за валидностью памяти. Но, когда дело доходит до вызова внешней функции компилятор уже будет не способен отследить время жизни и валидность памяти.
|
||||||
|
|
||||||
**Начать с проблемы, когда компилятор не может гарантировать безопасность по памяти (но без этого невозможно написать программу), возможно из ub**
|
**Начать с проблемы, когда компилятор не может гарантировать безопасность по памяти (но без этого невозможно написать программу), возможно из ub**
|
||||||
Допустим, на вход вашей функции
|
Допустим, на вход вашей функции
|
||||||
|
|
||||||
**Рассказать про причины ub**
|
**Рассказать про причины ub**
|
||||||
|
- как в математике есть неопределенности (к примеру, для деления на ноль), так и в языках программирования тоже есть свои неопределенности.
|
||||||
Именно для этого и было создана такая вещь, как неопределённое поведение.
|
Именно для этого и было создана такая вещь, как неопределённое поведение.
|
||||||
|
|
||||||
**Рассказать, чем является unsafe, ответственность на программисте, про ub (НЕ является избавлением от borrow checker)**
|
**Рассказать, чем является unsafe, ответственность на программисте, про ub (НЕ является избавлением от borrow checker)**
|
||||||
|
|
||||||
**Рассказать про применение unsafe (взаимодействие с С, оптимизация (вспомнить небезопасную либу для бэкенда: rocket или actix), написание основы/базы языка)**
|
**Рассказать про применение unsafe (взаимодействие с С, оптимизация (вспомнить небезопасную либу для бэкенда: rocket или actix), написание основы/базы языка)**
|
||||||
|
|
||||||
|
**Практика по пути**
|
||||||
|
|
||||||
|
|
||||||
- [ ] Определении функции unsafe если соблюдение инвариантов висит на пользователе (при написании такой функции смотреть - является ли сам интерфейс функции safe)
|
- [ ] Определении функции unsafe если соблюдение инвариантов висит на пользователе (при написании такой функции смотреть - является ли сам интерфейс функции safe)
|
||||||
- [ ] примеры из third party
|
- [ ] примеры из third party
|
||||||
- [ ] Рассказать про бест практис при написании unsafe:
|
- [ ] Рассказать про бест практис при написании unsafe:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user