加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java中的泛型 – 与遗留代码互操作

发布时间:2020-12-15 04:09:58 所属栏目:Java 来源:网络整理
导读:我正在阅读Oracle http://docs.oracle.com/javase/tutorial/extra/generics/legacy.html的本教程 但我无法弄清楚这条线的含义 As a result, the type safety and integrity of the Java virtual machine are never at risk,even in the presence of unchecke
我正在阅读Oracle http://docs.oracle.com/javase/tutorial/extra/generics/legacy.html的本教程

但我无法弄清楚这条线的含义

As a result,the type safety and integrity of the Java virtual machine
are never at risk,even in the presence of unchecked warnings.

有人可以更清楚地为我解释一下吗?
补充:JVM的“完整性”究竟是什么?“有风险”究竟是什么意思?

解决方法

这意味着JVM永远不会被认为对象是一种它不是的类型.欺骗运行时认为一块数据具有不同的类型是一个强大的攻击向量,特别是如果你可以欺骗运行时允许你为它认为是long或int的值赋值,但实际上是一个指针.

JVM的基本安全模型依赖于对象是运行时认为它的类型.

我读了一篇引人入胜的论文,详细介绍了对运行Java的机器的攻击,该机器涉及使用加热灯来大幅增加内存错误.然后,他们使用了一个程序,数十亿个对象在内存中策略性地对齐,并等待一个有零星的位翻转.这样做会欺骗JVM认为它正在处理不同类型的对象,并最终允许JVM运行任意代码(对于完整的读取,请参阅Using Memory Errors to Attack a Virtual Machine).

他们使用位翻转的事实与泛型无关.但是,该文章详细介绍了欺骗运行时思考对象的不同类型的能力.总而言之,想象一下你有A和B类:

class A {
    public long data = 0;
}

class B {
}

如果你能以某种方式欺骗JVM允许这样做:

A aButActuallyB = someMagicAssignment(new B());

someMagicAssignment是一个可以引用B的方法,并以某种方式将引用对象作为A返回.然后考虑当你执行时实际会发生什么:

aButActuallyB.data = 0x05124202;

您可能正在写入JVM原始内存中的任意数据!例如,该数据可以是方法的位置.将其更改为指向某个字节数组的内容可以让您随后运行任意代码.

所以当Oracle说

the type safety and integrity of the Java virtual machine are never at risk,even in the presence of unchecked warnings.

它的含义是即使你能做到这一点:

public static <T> T someMagicAssignment(B b){ 
   return (T) b; //unchecked cast warning
}

然后调用它:

A a = MyClass.<A>someMagicAssignment(new B());

这仍然会在分配到a时进行运行时检查.

因此,编写该方法someMagicAssignment并不比以前容易.泛型不会以任何方式增加此攻击向量的表面区域,因为JVM在其内部类型系统中忽略了泛型.从来没有JVM允许您为List< String>提供方法,然后让该方法对该列表的元素执行String操作,而不在运行时检查元素实际上是字符串.绝不允许你在没有人工检查的情况下将B视为A.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读