diff --git a/4.2/2.md b/4.2/2.md index 1e12f2c..03e2bf8 100644 --- a/4.2/2.md +++ b/4.2/2.md @@ -47,18 +47,48 @@ ub: из-за различий архитектру цп и ос и для оп # 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** +- как в математике есть неопределенности (к примеру, для деления на ноль), так и в языках программирования тоже есть свои неопределенности. Именно для этого и было создана такая вещь, как неопределённое поведение. **Рассказать, чем является unsafe, ответственность на программисте, про ub (НЕ является избавлением от borrow checker)** **Рассказать про применение unsafe (взаимодействие с С, оптимизация (вспомнить небезопасную либу для бэкенда: rocket или actix), написание основы/базы языка)** +**Практика по пути** + + - [ ] Определении функции unsafe если соблюдение инвариантов висит на пользователе (при написании такой функции смотреть - является ли сам интерфейс функции safe) - [ ] примеры из third party - [ ] Рассказать про бест практис при написании unsafe: