Что происходит при переполнении строки Java? - PullRequest
3 голосов
/ 19 марта 2020

Насколько я понимаю, Java Строки - это просто массив символов, с максимальной длиной, являющейся целочисленным значением. Если я правильно понимаю этот ответ , возможно вызвать переполнение строкой - хотя в " необычные обстоятельства ".

Поскольку Java Строки основаны на массивах символов и Java автоматически проверяет границы массивов, переполнение буфера возможно только в необычном сценарии ios:

  1. Если Вы вызываете нативный код через JNI
  2. В самой JVM (обычно пишется на C ++)
  3. Интерпретатор или JIT-компилятор не работают правильно (Java проверка границ с обязательным байт-кодом)

Поправьте меня, если я ошибаюсь, но я считаю, что это означает, что вы можете писать за пределами массива, без , вызывающим исключение ArrayIndexOutOfBounds (или подобное).

Я столкнулся с проблемами в C ++ из-за переполнения буфера, и я могу найти множество советов по поводу других языков , но ни один из них конкретно не отвечает на то, что произойдет, если вы вызовете переполнение буфера с помощью String (или любой другой тип массива) в Java.

Я знаю, что Java Строки проверяются на наличие границ и не могут быть переполнены только собственным кодом Java (если проблемы не присутствуют в компилятор или JVM, в соответствии с пунктами 2 и 3 выше), но первый пункт подразумевает, что технически 1031 * возможно * привести к тому, что char [] окажется в ... нежелательной позиции.

Учитывая это У меня есть два специфических c вопроса о поведении таких проблем в Java, при условии, что вышеприведенное верно:

  1. Если строка может переполниться, что произойдет, если это произойдет?
  2. Какими будут последствия этого поведения?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 19 марта 2020

Чтобы ответить на ваш первый вопрос, мне посчастливилось вызвать такую ​​ошибку, и выполнение просто перестало выдавать одну из следующих ошибок:

java.lang.OutOfMemoryError: Requested array size exceeds VM limit

Так что это был мой случай, я не Не знаю, представляет ли это проблему безопасности как переполнение буфера в C и C ++.

0 голосов
/ 19 марта 2020

Строка в Java является неизменной, поэтому после создания запись в базовый массив char или массив byte не записывается (это зависит от версии Java и содержимого строки: другой используется). Хорошо, использование JNI может обойти это, но с чистым Java невозможно выйти за границы массива, не вызывая ArrayOutOfBoundsException или подобное.

Единственный способ вызвать своего рода переполнение в контексте обработки строк можно было бы создать новую строку слишком длинной. Убедитесь, что у вашей JVM достаточно кучи (около 36 ГБ), создайте массив char из Integer.MAX_VALUE - 1, заполните его соответствующим образом, вызовите new String( byte [] ) с этим массивом, а затем выполните

var string = string.concat( new String( array ) );

Но результат - исключение, сообщающее, что была предпринята попытка создать слишком большой массив.

...