这个(不安全的)代码会使JVM崩溃吗?

大卫·蒂塔伦科

这里稍作修改

import sun.misc.Unsafe;
import java.lang.reflect.*;

public class K {
    private static Unsafe unsafe;
    private static int fieldOffset;
    private static K instance = new K();

    static {
        try {
            Field f = Unsafe.class.getDeclaredField("theUnsafe");
            f.setAccessible(true);

            unsafe = (Unsafe) f.get(null);

            fieldOffset = unsafe.fieldOffset(K.class.getDeclaredField("obj"));
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }

    private Object obj;

    public synchronized static long toAddress(int o) {
        instance.obj = o;
        return unsafe.getLong(instance, fieldOffset);
    }

    public synchronized static Object toObject(long address) {
        unsafe.putLong(instance, fieldOffset, address);
        return instance.obj;
    }

    public static void main(String[] args) {
        int x = 20;

        System.err.println("x was = " + x);
        long addr = toAddress(x);
        System.err.println("&x = " + addr);
        x = 70;
        System.out.println("x is now " + x);
        long newAddr = toAddress(x);
        System.err.println("new (&x) = " + newAddr);

        System.out.println("Previous value of x is " + toObject(addr)); // !!!
    }
}

我特别担心标有的行!!!如果原始x垃圾被收集起来,那么其地址可能毫无价值。

我的问题是,JVM segfault还是会因(toObject(BOGUS_VALUE)总是NullPointerException被捕获)而失败

我敢肯定你们大多数人都知道,这个Unsafe文件充其量是最多的。

Sotirios Delimanolis

我添加了一些可能在尝试检索丢失的对象之前可能导致GC的代码。

for (int i = 0; i < 1000000; i ++) {
    new Object().toString();
}
System.out.println("Previous value of x is " + toObject(addr).getClass()); // !!!

并得到了

#  SIGSEGV (0xb) at pc=0x000000010e627c46, pid=49698, tid=6403

您所拥有的地址可能不再指向可以被视为对象的内容。是的Unsafe

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

这个查询真的不安全吗?

来自分类Dev

这个查询真的不安全吗?

来自分类Dev

这个不安全的 C++ 代码在 Python 中安全吗?

来自分类Dev

这个Python登录实际上不安全吗?

来自分类Dev

云服务项目 (ccproj) 不会使用不安全的代码进行编译 - VSTS

来自分类Dev

安全代码中的不安全标签

来自分类Dev

编译C#不安全代码

来自分类Dev

了解不安全代码及其用法

来自分类Dev

subprocess.Popen不安全吗?

来自分类Dev

e.preventDefault()不安全吗?

来自分类Dev

C#中不安全的代码会导致内存损坏吗?

来自分类Dev

以下代码线程不安全吗?是的,我如何使可能的结果出来呢?

来自分类Dev

在C#中使不安全代码安全

来自分类Dev

在C#中使不安全代码安全

来自分类Dev

缓冲区与不安全-外部JVM

来自分类Dev

不安全的浏览

来自分类Dev

不安全的BasicHttpBinding

来自分类Dev

如何使用不安全的代码Unity

来自分类Dev

如何使用不安全的代码Unity

来自分类Dev

惯用的防锈代码是否总是避免“不安全”?

来自分类Dev

通过HTTP URL执行代码是否不安全?

来自分类Dev

是否管理C#不安全代码?

来自分类Dev

我可以创建“不安全的闭合”吗?

来自分类Dev

使用rand生成uuid是不安全的吗?

来自分类Dev

对NSManagedObject的属性引用不安全吗?

来自分类Dev

使用pinvoke会将.NET标记为不安全吗?

来自分类Dev

是Access-Control-Allow-Origin:*不安全吗?

来自分类Dev

CSP style-src:“不安全内联”-值得吗?

来自分类Dev

“不安全”范围的嵌套会影响性能吗?