File tree Expand file tree Collapse file tree 6 files changed +0
-55
lines changed
src/safe-guides/coding_practice/unsafe_rust Expand file tree Collapse file tree 6 files changed +0
-55
lines changed Original file line number Diff line number Diff line change @@ -8,21 +8,3 @@ Rust 可以通过C-ABI无缝与C语言打交道,也可以通过暴露 C-ABI
8
8
9
9
本小节内容,包含以上两种情况。
10
10
11
- ## 列表
12
-
13
- - [ P.UNS.FFI.01 避免从公开的 Rust API 直接传字符串到 C 中] ( ./ffi/P.UNS.FFI.01.md )
14
- - [ P.UNS.FFI.02 在使用标准库 std::ffi 模块提供的类型时需要仔细查看其文档] ( ./ffi/P.UNS.FFI.02.md )
15
- - [ P.UNS.FFI.03 当使用来自 C 的指针时,如果该指针需要管理内存,则需要为包装该指针的 Rust 类型实现 Drop 特质] ( ./ffi/P.UNS.FFI.03.md )
16
- - [ P.UNS.FFI.04 如果一个函数正在跨越 FFi 边界,那么需要处理 Panic] ( ./ffi/P.UNS.FFI.04.md )
17
- - [ P.UNS.FFI.05 建议使用诸如标准库或 ` libc crate ` 所提供的可移植类型别名,而不是特定平台的类型] ( ./ffi/P.UNS.FFI.05.md )
18
- - [ P.UNS.FFI.06 Rust 和 C 之间传递字符或字符串时需要注意字符串要符合 C-ABI 以及 字符串的编码] ( ./ffi/P.UNS.FFI.06.md )
19
- - [ P.UNS.FFI.07 不要为任何传入到外部的类型实现 Drop] ( ./ffi/P.UNS.FFI.07.md )
20
- - [ P.UNS.FFI.08 FFi 中要进行合理的错误处理] ( ./ffi/P.UNS.FFI.08.md )
21
- - [ P.UNS.FFI.09 当 Rust 调用外部 C 函数时,如果可以确认安全,可以通过引用来代替裸指针] ( ./ffi/P.UNS.FFI.09.md )
22
- - [ P.UNS.FFI.10 当 Rust 函数导出外部函数时,必须从设计上保证被跨线程调用的安全性] ( ./ffi/P.UNS.FFI.10.md )
23
- - [ P.UNS.FFI.11 如需引用指定为 ` #[repr(packed)] ` 内存布局的结构体成员字段要注意合理规避未定义行为] ( ./ffi/P.UNS.FFI.11.md )
24
- - [ P.UNS.FFI.12 当依赖 C 端传入参数时,需要在文档注释中不变性声明,根据不同的调用场景选择合适的安全抽象方式] ( ./ffi/P.UNS.FFI.12.md )
25
- - [ P.UNS.FFI.13 自定义数据类型要保证一致的数据布局] ( ./ffi/G.UNS.FFI.13.md )
26
- - [ P.UNS.FFI.14 在 FFi 中使用的类型应该拥有稳定布局] ( ./ffi/G.UNS.FFI.14.md )
27
- - [ P.UNS.FFI.15 从外部传入的不健壮类型的外部值要进行检查] ( ./ffi/G.UNS.FFI.15.md )
28
-
Original file line number Diff line number Diff line change 2
2
3
3
Rust 标准库提供了 I/O 安全性,保证程序持有私有的原始句柄(raw handle),其他部分无法访问它。但是 ` FromRawFd::from_raw_fd ` 是 Unsafe 的,所以在 Safe Rust中无法做到 ` File::from_raw(7) ` 这种事。 在这个文件描述符上面进行` I/O ` 操作,而这个文件描述符可能被程序的其他部分私自持有。
4
4
5
- ## 列表
6
-
7
- - [ G.UNS.FIO.01 在使用原始句柄的时候,要注意 I/O 安全性] ( ./io/G.UNS.FIO.01.md )
Original file line number Diff line number Diff line change 2
2
3
3
这里指 Unsafe Rust 下的数据布局、内存管理和使用相关规范。
4
4
5
- ## 列表
6
-
7
- - [ P.UNS.MEM.01 要注意选择合适的结构体、元组、枚举的数据布局] ( ./mem/P.UNS.MEM.01.md )
8
- - [ P.UNS.MEM.02 不能修改其它进程/动态库的内存变量] ( ./mem/P.UNS.MEM.02.md )
9
- - [ P.UNS.MEM.03 不能让 ` String/Vec ` 自动 ` Drop ` 其它进程/动态库的内存数据] ( ./mem/P.UNS.MEM.03.md )
10
- - [ P.UNS.MEM.04 尽量用可重入(reentrant)版本的 C-API 或系统调用] ( ./mem/P.UNS.MEM.04.md )
11
- - [ P.UNS.MEM.05 如果需要使用位域,推荐使用第三方库] ( ./mem/P.UNS.MEM.05.md )
12
- - [ G.UNS.MEM.01 使用 ` MaybeUninit<T> ` 来处理未初始化的内存] ( ./mem/G.UNS.MEM.01.md )
Original file line number Diff line number Diff line change @@ -11,11 +11,3 @@ Rust提供了`*const T`(不变)和`*mut T`(可变)两种指针类型。
11
11
12
12
可见,原生指针并不受Safe Rust提供的那一层“安全外衣”保护,所以也被称为“裸指针”。
13
13
14
- ## 列表
15
-
16
- - [ P.UNS.PTR.01 不要将裸指针在多线程间共享] ( ./raw_ptr/P.UNS.PTR.01.md )
17
- - [ P.UNS.PTR.02 建议使用 ` NonNull<T> ` 来替代 ` *mut T ` ] ( ./raw_ptr/P.UNS.PTR.02.md )
18
- - [ P.UNS.PTR.03 使用指针类型构造泛型结构体时,需要使用 PhantomData<T > 来指定 T上的协变和所有权] ( ./raw_ptr/P.UNS.PTR.03.md )
19
- - [ G.UNS.PTR.01 当指针类型被强转为和当前内存对齐不一致的指针类型时,禁止对其解引用] ( ./raw_ptr/G.UNS.PTR.01.md )
20
- - [ G.UNS.PTR.02 禁止将不可变指针手工转换为可变指针] ( ./raw_ptr/G.UNS.PTR.02.md )
21
- - [ G.UNS.PTR.03 尽量使用 pointer::cast 来代替 使用 as 强转指针] ( ./raw_ptr/G.UNS.PTR.03.md )
Original file line number Diff line number Diff line change @@ -9,17 +9,3 @@ Unsafe Rust 中 API 的安全性设计通常有两种方式:
9
9
10
10
第二种方式,对 Unsafe 代码进行安全抽象,是 Rust 生态的一种约定俗成。
11
11
12
- ## 列表
13
-
14
- - [ P.UNS.SAS.01 代码中要注意是否会因为 Panic 发生而导致内存安全问题] ( ./safe_abstract/P.UNS.SAS.01.md )
15
- - [ P.UNS.SAS.02 Unsafe 代码编写者有义务检查代码是否满足安全不变式] ( ./safe_abstract/P.UNS.SAS.02.md )
16
- - [ P.UNS.SAS.03 不要随便在公开的 API 中暴露未初始化内存] ( ./uafe_abstract/P.UNS.SAS.03.md )
17
- - [ P.UNS.SAS.04 要考虑 Panic Safety 的情况] ( ./safe_abstract/P.UNS.SAS.04.md )
18
- - [ P.UNS.SAS.05 Unsafe 代码中手动实现 ` auto trait ` 需要注意] ( ./safe_abstract/P.UNS.SAS.05.md )
19
- - [ P.UNS.SAS.06 不要随便在公开的 API 中暴露裸指针] ( ./safe_abstract/P.UNS.SAS.06.md )
20
- - [ P.UNS.SAS.07 在抽象安全方法的同时,也建议为性能考虑而增加相应的 Unsafe 方法] ( ./safe_abstract/P.UNS.SAS.07.md )
21
- - [ P.UNS.SAS.08 函数参数是不可变借用的时候,返回值不应该是可变借用] ( ./safe_abstract/P.UNS.SAS.08.md )
22
- - [ P.UNS.SAS.09 在任何 Unsafe 块之前都应该加 ` SAFETY ` 注释] ( ./safe_abstract/P.UNS.SAS.09.md )
23
- - [ G.UNS.SAS.01 在公开的 unsafe 函数的文档中必须增加 Safety 注释] ( ./safe_abstract/G.UNS.SAS.01.md )
24
- - [ G.UNS.SAS.02 在 Unafe 函数中应该使用 ` assert! ` 而非 ` debug_assert! ` 去校验边界条件] ( ./safe_abstract/G.UNS.SAS.02.md )
25
-
Original file line number Diff line number Diff line change @@ -6,7 +6,3 @@ Union 是没有 tag 的 Enum,Enum 是有 tag 的Union 。
6
6
7
7
正因为没有 tag,Rust 编译器无法检查当前使用的正是哪个变体,所以,访问 Union 的变体是 Unsafe 的。
8
8
9
- ## 列表
10
-
11
- - [ P.UNS.UNI.01 除了与 C 交互,尽量不要使用 Union] ( ./union/P.UNS.UNI.01.md )
12
- - [ P.UNS.UNI.02 不要把联合体的不同变体用在不同生命周期内] ( ./union/P.UNS.UNI.02.md )
You can’t perform that action at this time.
0 commit comments