主要观点:
- 在 Rust 中,栈溢出是一种难以恢复的程序终止方式,会触发
SIGSEGV
或SIGBUS
信号,Rust 安装的信号处理程序会检查导致信号的地址是否为保护页,若是则终止整个程序。 - 与 Go 等有运行时的语言不同,Rust 没有运行时来手动检查栈,所以通过定义
depth
计数器在每次递归调用时递减来处理栈溢出。 - 为了使代码更通用,定义了一些辅助函数和类型,包括使用 Peano 编码定义自然数类型
Nat
,以及实现Nat
的递归函数recurse
,并通过宏来简化代码。
关键信息:
- Rust 中栈溢出的处理机制及相关代码位置。
- 用
depth
计数器处理栈溢出的简单示例。 - 定义自然数类型
Nat
及相关辅助函数的代码。 - 用宏实现更通用的栈保护递归函数的过程及相关代码。
重要细节:
- 在 Unix 系统中,栈末尾之后的区域被设置为保护页。
- Rust 的信号处理程序会检查导致信号的地址是否为保护页并终止程序。
- 用
depth
计数器的方式简单但不够通用。 - 定义
Nat
类型及recurse
函数的具体实现细节。 - 宏
fancy_make_def
的具体展开及作用,解决了self
标识符的作用域问题。 - 宏实现的缺点,如不能接受泛型参数、增加代码生成时间和二进制大小等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。