ast*_*eri 11 java memory null nullpointerexception
我刚刚了解到,null在C和C++ 中取消引用有时会产生不确定的结果.这对我来说非常有趣,就像所有奇怪的编程行为一样(我曾经有人告诉我他们调试了"损坏的RAM - 程序在合法的生产环境中不能像编写的那样运行").因为我主要是一名Java开发人员,所以我想知道这种语言是否有可能以这种语言发生?
该JLS是不特定对如何null参考实现(3.10.7,4.1,15.8.1),所以我不太清楚.但我认为通过使用Unsafe API直接操作内存地址可能是可能的.不幸的是,我对JVM的内部工作原理知之甚少,无法知道这是否可行.
如果它是可行的,那么这将是可能的恶意程序也这样做,这将打开一个有趣的安全问题.
那么:Java在解除引用时是否可能有未定义的行为null,而不是简单地抛出NullPointerException?
Hol*_*ger 10
JLS的是不特定的空引用是如何实现的,但它规定了其行为.换句话说,没有没有未指明的行为.如果您遇到JLS中指定的行为以外的行为,那就是一个错误.
让我澄清一下:您可以使用本机代码来删除某些结构,让JVM崩溃,但这与任何Java行为无关.但是在典型的JVM实现中,null行为的实现是您可以打扰的最后一件事.不重要的是,如果你从本机代码覆盖任意内存,你会丢弃什么.
"未指定的行为"意味着规范本身允许在结果行为中存在差异.Java不是这种情况.
您无法从null纯Java中获取未定义的行为(除非JVM中存在严重错误!).JLS指定任何明确或隐式取消引用a的尝试null都会导致a NullPointerException.没有蠕动空间允许任何与处理相关的未定义行为null.
但是,如果您的应用程序包含...或使用... native方法,则其中一种方法可能会以null导致未定义行为的方式错误处理.您还可以使用Unsafe该类获取未定义的行为.但这两种情况都意味着您不使用纯 Java.(当你走出纯 Java 之外,JLS的保证不再适用!)
(可能发生不可预测事情的一个领域是多线程.但即便如此,也可以定义一组可能的行为.例如,如果你没有充分同步状态共享,你可能会看到字段中的陈旧值.但是你赢了看不到完全随机的值...或导致分段违规的错误地址.)
如果可能,那么恶意程序也可能这样做,这将开启一个有趣的安全问题.
恶意程序几乎可以做任何事情.但处理此问题的正确方法是在沙箱中执行您不信任的代码(即可能是恶意代码).典型的沙箱禁止调用Unsafe或加载本机库......以及恶意程序可以利用的许多其他内容.