Java与类型安全
在比较Java和JavaScript时,《MDN JavaScript指南》说明了以下内容: 例如,类型安全意味着不能将Java整数强制转换到对象引用中,也不能通过破坏Java字节码来访问私有内存 当然,关于上述语句的第一部分,当谈到类型时,类型安全的一般概念是围绕一种语言能力展开的,这种语言能够提供某种检查,消除与使用不兼容类型执行的操作有关的可能的错误条件(考虑到在Java中可以将primitiveJava与类型安全,java,javascript,type-safety,Java,Javascript,Type Safety,在比较Java和JavaScript时,《MDN JavaScript指南》说明了以下内容: 例如,类型安全意味着不能将Java整数强制转换到对象引用中,也不能通过破坏Java字节码来访问私有内存 当然,关于上述语句的第一部分,当谈到类型时,类型安全的一般概念是围绕一种语言能力展开的,这种语言能够提供某种检查,消除与使用不兼容类型执行的操作有关的可能的错误条件(考虑到在Java中可以将primitiveint框到引用类型Integer,即使上面的示例很幼稚) 但是,声明的第二部分究竟是什么意思
int
框到引用类型Integer
,即使上面的示例很幼稚)
但是,声明的第二部分究竟是什么意思
有人说JVM的验证器可以确保一定程度的内存保护,即“不能将任意位模式用作地址”
MDN语句的第二部分与类型安全性有什么关系?这意味着在Java中,存在(原则上)无法回避如何识别类型。在javascript中,可以根据表示一段数据的字节序列的方式推断类型。在Java中,VM阻止这类事情,以确保打算作为Foo对象的字节序列不能被视为Bar对象 关于访问私有成员,这意味着您不能使一个字节序列表示与程序员预期不同的内容,以获得对非预期内容的访问。在运行时,您不能使用私有成员将类型为
foo
的对象foobar
更改为类型为Bar
的对象h相同的成员,但公开了foobar
。
每个对象的类型都用字节码编码,字节码在运行时由VM控制。我怀疑它们的意思是,不能像在C中那样将任意内存地址强制转换为不同的类型
struct bar_s {
char foo_s[100];
}
void stuff() {
int foo = 5;
bar_s *bar = &foo;
}
如果语法错误,请原谅我,我的C已经生锈了。这会获取foo的内存地址,将其分配给指向bar_s结构的指针,然后您就可以轻松地取消引用。您正在将原本是int的内存区域视为bar_s
在C语言中,有许多攻击向量允许您用任意信息覆盖内存,并随后执行。请参阅
在java中,一旦是整数,就始终是整数[*]。所有数组上都有边界检查,这有助于防止缓冲区溢出
[*]在垃圾收集之前,即。int到引用类型Integer,这只是编译器的“魔法”。在内部(字节码,jni),这些类型根本不兼容。