Rust 是不是认为内存泄漏不是一个“安全”问题？
Java和一票C们：如果内存泄漏都不是问题了，那我们还费那老劲干嘛？Rust是怎么想的？
内存泄漏当然是一个问题。但它到底是不是“安全”问题，要看你怎么理解安全。

“安全”这个中文词汇在信息安全专业领域的表意上是模糊的。因为有两个领域内的专有英文名词都被翻译为安全：safety 和 security，但他们的含义大不相同。

Safety指系统本身在自然状态、无人为因素故意干扰的情况下不会出现非预期状态。拿日常生活举例，“地面湿滑请注意安全”，这里的安全就指行人在自然状态下行走时不会滑倒。

Rust 所强调的“内存安全”也是这个安全，英文为 memory safety ，指的是在自然运行过程中，程序不会访问到非法的、畸形的内存数据值。为什么说use-after-free是一个内存安全问题？因为程序一旦访问一个已经被释放的指针，那么程序读出来的数据值将不再有任何保障，不再有任何逻辑上的约束，可能读到任意的非法畸形数据值。为什么说数组下标越界读（读野指针）是一个内存安全问题？同理，因为程序一旦超过数组的边界访问数据，程序将可能读出来任意的非法畸形数据值。为什么说数组下标越界写（写野指针）是一个内存安全问题？因为程序一旦向一个任意的内存地址写入数据，将可能使得原本处在那个位置处的数据值变为非法畸形数据值。

因此，内存泄漏不是一个 Rust 所关心的内存安全问题。每次发生内存泄漏，顶多会使得程序可用的内存数量减少，但不会破坏程序内存中的数据使其变为非法畸形数据。

与 safety 相对的另一个概念是 security 。Security 与 safety 最大的区别是 security强调“有坏人在故意地搞破坏”。如果说一个程序是 secure的，那么意味着坏人极尽所能故意地搞破坏也无法对这个程序造成影响，或者通过这个程序对其他的事物造成影响。为什么“安检”翻译为 security check而不是 safety check？因为安检防的就是想要故意地搞破坏的恐怖分子，是在防范别有用心之人而不是防范大自然的物理法则。

那么在 security的视角下，如果恶意的攻击者（黑客）可以利用你程序里面存在的内存泄漏使得你的程序因为内存耗尽而崩溃，并最终使得你的程序向用户提供的服务中断，那么恶意攻击者就故意地破坏了你的程序所提供的服务（也就是常说的DoS 攻击），此时这个内存泄漏就是一个安全（security）问题。

总结，如果上下文中的安全指 safety，那么内存泄漏并不是一个内存安全问题，因为它无法对内存中的数据造成破坏。但如果上下文中的安全指security，那么那些能够被恶意攻击者利用来攻击系统的内存泄漏就是 security 问题，因为恶意攻击者可以发起 DoS攻击，故意地通过内存泄漏破坏系统的可用性。