为了账号安全,请及时绑定邮箱和手机立即绑定

Java代码会导致Linux中的分段错误吗?

Java代码会导致Linux中的分段错误吗?

跃然一笑 2022-09-07 21:04:02
据说java在内存处理方面比C更安全。在C中,很容易通过访问无效指针来引起分段错误。现在我想知道java代码是否也会导致分割错误。有人可以给我举个例子吗?
查看完整描述

3 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

通常在普通的Java程序中,您没有这个问题。但是,是的,如果您使用类似的东西可能会导致分段错误。但是,这就是为什么被称为.通常,您不必使用它,因此代码中就不会有此问题。sun.misc.UnsafeUnsafeUnsafe


有关详细信息:sun.misc.Unsafe 记录在哪里?


基于带有 https://github.com/eclipse/openj9/issues/4153 分段错误报告的错误sun.misc.Unsafe


下面是一个如何测试的示例:


import java.lang.reflect.Field;


import sun.misc.Unsafe;


public class MainClass {


public static void main(String[] args)

        throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {


    Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");

    theUnsafe.setAccessible(true);

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



     long ten = 10;

     byte size = 1;

     long mem = unsafe.allocateMemory(size);

     //Put here the wrong address!!!

     unsafe.putAddress(1, ten);

     //With this will work:

     //unsafe.putAddress(mem, ten);

     long readValue = unsafe.getAddress(mem);

     System.out.println("result: " + readValue);

}


}

当我在Ubuntu 18.04上执行时,我得到这个输出:A fatal error has been detected by the Java Runtime Environment:


SIGSEGV (0xb) at pc=0x00007f05bdf04d27, pid=4145, tid=4147


JRE version: OpenJDK Runtime Environment (10.0.2+13) (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)


在Windows上,我认为它将是具有致命错误描述的类似输出。


祝大家好运!


查看完整回答
反对 回复 2022-09-07
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

Java 语言规范和 Java 虚拟机规范都没有提到分段错误是 Java 程序或 JVM 的行为。这是因为“分段错误”是系统特定的东西(特定于Unix操作系统),而Java意味着可移植。这些规范也没有给出任何像分割错误这样的错误作为允许的行为。此外,Java字节码的指定语义没有类似于C或C++的“未定义行为”的内容。因此,JVM 规范不允许纯 Java 代码导致分段错误。

如果纯Java程序导致分段错误,则表明JVM本身存在错误。Linux 上的 JVM 是否存在可能导致分段错误的 bug?答案是肯定的。但是在这种情况下,说Java代码导致了分段错误是正确的吗?我认为不是。我会说“JVM中的错误”导致了分段错误。

因此,从学理上讲,你的问题的答案是否定的

Java也可以调用“本机代码”(在实践中意味着C代码)。该 C 代码可能存在 bug,因此它执行的行为未定义,从而导致分段错误。同样,从学理上讲,Java代码没有导致分段错误;我会说“本机代码中的错误”导致了分段错误。


查看完整回答
反对 回复 2022-09-07
?
UYOU

TA贡献1878条经验 获得超4个赞

Java有一个用于执行本机代码(JNI)的接口。这样就可以调用用C编写的代码,从而使分段错误成为可能。

JVM代码本身中的错误可能会导致分段错误,但这些错误相当罕见。

使用纯Java,没有。该语言旨在仅允许指向有效地址或 null 的引用。在后者之后,您将获得NullPointerException。


查看完整回答
反对 回复 2022-09-07
  • 3 回答
  • 0 关注
  • 167 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号