将来,托管运行时是否会针对细微的数据损坏问题提供额外的保护?
Java 和 .NET CLR 等托管运行时减少或消除了 C# 等本地语言中常见的许多内存损坏错误的可能性。尽管如此,令人惊讶的是,它们并不能免受所有内存损坏问题的影响。人们直观地期望验证其输入、没有错误并稳健地处理异常的方法将始终将其对象从一种有效状态转换为另一种有效状态,但事实并非如此。(更准确地说,使用流行的编程约定并非如此——对象实现者需要竭尽全力避免我描述的问题。)
考虑以下场景:
穿线。调用者可能与其他线程共享对象并对其进行并发调用。如果对象未实现锁定,则字段可能已损坏。(也许——除非通知对象是线程安全的——如果同一对象上的任何方法在另一个线程上同时执行,运行时应该在每个方法调用上使用互锁以引发异常。这将是一种保护功能,只是与托管运行时的其他广为接受的安全功能一样,它也有一定的成本。)
重入。该方法对任意函数(例如事件处理程序)进行调用,该函数最终调用对象上的方法,而这些方法并非设计为在该点调用。这甚至比线程安全更棘手,许多类库都没有做到这一点。(更糟糕的是,众所周知,类库很少记录允许重入的内容。)
对于所有这些情况,可以说完整的文档是一种解决方案。但是,文档也可以规定如何在非托管语言中分配和取消分配内存。我们从经验中知道(例如,内存分配),文档和语言/运行时执行之间的区别是白天和黑夜。
我们对未来的语言和运行时有什么期望来保护我们免受这些问题和其他类似的微妙问题的影响?