据我了解,Java Strings只是一个字符数组,最大长度是一个整数值。 如果我正确理解this answer,可能会导致字符串溢出-尽管在“ 异常情况”中。
由于Java字符串基于char数组,并且Java自动检查数组范围,因此仅在特殊情况下才可能发生缓冲区溢出:
- 如果您通过JNI调用本机代码
- 在JVM本身(通常用C ++编写)中
- 解释器或JIT编译器无法正常工作(Java字节码强制性边界检查)
如果我错了,请更正我,但是我相信这意味着您可以在数组的边界外进行写操作,而无需触发ArrayIndexOutOfBounds
(或类似的)异常。 >
我在C ++中遇到了缓冲区溢出的问题,我可以找到许多有关other languages的建议,但是没有一个具体的答案可以回答如果您导致String(或任何其他数组类型)导致缓冲区溢出的情况)。
我知道Java字符串是经过边界检查的,不能仅由本机Java代码溢出(除非根据上面的第2点和第3点,除非编译器或JVM中存在问题),但是第一点意味着从技术上来说可以将char []置于...不良的位置。
鉴于此,假设以上内容正确,我对Java中此类问题的行为有两个具体问题:
谢谢。
答案 0 :(得分:3)
要回答您的第一个问题,我很幸运能真正导致此类错误,而执行只是停止抛出以下错误之一:
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
这就是我的情况,我不知道这是否代表安全问题,因为C和C ++中的缓冲区溢出。
答案 1 :(得分:0)
Java中的String是不可变的,因此一旦创建,就不会写入char
或byte
的基础数组(取决于Java版本和String的内容,是否是另一个)。好的,使用JNI可以避免这种情况,但是使用纯Java,就不可能在不引起ArrayOutOfBoundsException
之类的情况下离开数组的边界。
在String处理的上下文中引起某种溢出的唯一方法是创建一个太长的新String。确保您的JVM有足够的堆(大约36 GB),创建一个char
的{{1}}数组,适当地填充,使用该数组调用Integer.MAX_VALUE - 1
,然后执行
new String( byte [] )
但是结果只是一个异常,告诉您它试图创建一个太大的数组。