java - 我们能否利用类型系统来使程序更加安全?

标签 java c++ security types

这个问题的灵感来自 Joel 的“让错误的代码看起来错误”

http://www.joelonsoftware.com/articles/Wrong.html

有时,您可以使用类型在对象的接口(interface)之外强制执行语义。例如,Java 接口(interface) Serialized 实际上并没有定义方法,但对象实现 Serialized 的事实说明了应该如何使用它。

我们能否在 Java 中拥有 UnsafeString 和 SafeString 接口(interface)/子类,它们的使用方式与 Joel 的匈牙利表示法和 Java 的 Serialized 大致相同,这样它不仅看起来很糟糕,而且无法编译?

这在 Java/C/C++ 中可行吗?还是类型系统太弱或太动态?

此外,除了输入清理之外,还可以通过这种方式实现哪些其他安全功能?

最佳答案

类型系统已经强制执行大量此类安全功能。这本质上就是它的用途。

举一个非常简单的例子,它会阻止你将 float 视为 int。这是安全的一方面——它保证您正在处理的类型将按预期运行。它保证只对字符串调用字符串方法。例如,Assembly 就没有这种保护措施。

确保您不会调用类上的私有(private)函数也是类型系统的工作。这是另一个安全功能。

Java 的类型系统过于贫乏,无法有效地强制执行许多有趣的约束,但在许多其他语言(包括 C++)中,类型系统可用于强制执行更广泛的规则。

在 C++ 中,模板元编程为您提供了许多禁止“不良”代码的工具。例如:

class myclass : boost::noncopyable {
 ...
};

在编译时强制该类不能被复制。以下将产生编译错误:

myclass m;
myclass m2(m); // copy construction isn't allowed
myclass m3;
m3 = m; // assignment also not allowed

同样,我们可以确保在编译时模板函数仅在满足特定条件的类型上被调用(例如,它们必须是随机访问迭代器,而不允许双线性迭代器,或者它们必须是 POD 类型) ,或者它们不能是任何类型的整数类型(char、short、int、long),但所有其他类型都应该是合法的。

C++ 模板元编程的教科书示例实现了用于计算物理单元的库。它允许您将“米”类型的值与另一个相同类型的值相乘,并自动确定结果必须是“平方米”类型。或者将“英里”类型的值除以“小时”类型的值,得到“英里/小时”类型的单位。

同样,这是一项安全功能,可以防止您混淆类型并意外地混淆单位。如果您计算一个值并尝试将其分配给错误的类型,则会出现编译错误。尝试将升除以米 ^2 并将结果分配给一个值(例如千克)将导致编译错误。

当然,其中大部分需要一些手动工作来设置,但是该语言为您提供了基本构建所需类型检查所需的工具。其中一些可以直接在语言中得到更好的支持,但无论如何,更具创造性的检查都必须手动实现。

关于java - 我们能否利用类型系统来使程序更加安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1214151/

相关文章:

java - Libgdx设置TextField大小不会改变其大小

java - 将分隔的 txt 文件读入 JTable

java - paintComponent 中的图像仅在调整窗口大小后显示

C++ fstream - 仅读取某些变量类型的问题

php - 为什么 srand(time()) 是坏种子?

java - 数据类型为 Double 且值为 '0.0' 的变量未出现在 JSON 响应中

c++ - 在二进制数据(密文)上使用 CryptoPP::Base64Encoder

c++ - 摆动/摆动相机

java - 是否有支持 NIST 标准的随机生成器的 Java 8 实现?

java - 模拟 Hadoop 用户