【发布时间】:2020-03-19 11:02:13
【问题描述】:
据我了解,Java Strings 只是一个字符数组,最大长度为整数值。 如果我正确理解this answer,则可能会导致字符串溢出——尽管是在“不寻常的情况”中。
由于 Java 字符串基于 char 数组并且 Java 会自动检查数组边界,因此缓冲区溢出仅在不寻常的情况下才可能发生:
- 如果通过 JNI 调用本机代码
- 在 JVM 本身中(通常用 C++ 编写)
- 解释器或 JIT 编译器无法正常工作(Java 字节码强制边界检查)
如果我错了,请纠正我,但我相信这意味着您可以在数组边界之外写入,不会触发ArrayIndexOutOfBounds(或类似的)异常。
我在 C++ 中遇到过缓冲区溢出的问题,我可以找到很多关于 other languages 的建议,但没有人专门回答如果您使用 String(或任何其他数组类型)导致缓冲区溢出会发生什么Java。
我知道 Java 字符串是经过边界检查的,并且不能仅由本机 Java 代码溢出(除非编译器或 JVM 中存在问题,根据上面的第 2 点和第 3 点),但第一点意味着技术上有可能将 char[] 置于...不受欢迎的位置。
鉴于此,假设以上是正确的,我对 Java 中此类问题的行为有两个具体问题:
- 如果一个字符串可以溢出,当它溢出时会发生什么?
- 这种行为会产生什么影响?
提前致谢。
【问题讨论】:
-
您不能仅使用 Java 代码溢出字符串。字符串是不可变的。
-
即使内部表示也因version and runtime flags而异。 Java 摆脱了某些语言中存在的“正常”缓冲区溢出,因此如果您设法得到一个,可能很难确定究竟会发生什么。在大多数情况下,可能(半受过教育的猜测)是一个硬错误,而不是一个容易被利用的安全漏洞。
标签: java arrays string char overflow