JVM - баг или фича?

Тема в разделе "WASM.ZEN", создана пользователем scf, 18 июн 2008.

  1. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    JVM не проверяет корректность целочисленных значений перед передачей в метод.
    Пишем маленький класс:
    Код (Text):
    1. public class A {
    2.     public static void x(byte b){
    3.         System.out.println(b);
    4.     }
    5.     public static void main(String args[]){
    6.         x((byte)100);
    7.     }
    8. }
    Компилируем, открываем в редакторе байткода и заменяем в методе Main bipush 100 на sipush 1000:
    Код (Text):
    1.     sipush #1000
    2.     invokestatic void A.x(byte)
    3.     return
    Запускаем:
    D:\dev>java -cp . A
    1000

    Таким образом, в методе, получающем БАЙТ, параметр по факту может быть int-ом
    Естественно, т.к. в JVM из целочисленных только тип int, то проверять валидность диапазона никто не будет.
    Но насколько это "легально"? как согласуется с референсом?

    У кого какие мысли?
     
  2. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    scf

    В JVM Spec написано следующее (раздел 2.6.8 Method Invocation Conversion):

    Method invocation conversion is applied to each argument value in a method or constructor invocation: the type of the argument expression must be converted to the type of the corresponding parameter. Method invocation contexts allow the use of an identity conversion (§2.6.1), a widening primitive conversion (§2.6.2), or a widening reference conversion (§2.6.4). Method invocation conversions specifically do not include the implicit narrowing of integer constants that is part of assignment conversion (§2.6.7).

    Другими словами: возможность передачи большего значения известна, а встраивать проверку или приведение типов не стали, так как от нее в этом месте ни вреда, ни пользы.
     
  3. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Так это же такие возможности для обфускации :)
    тот же JAD декомпилирует такой код некорректно
     
  4. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    scf
    Jad очень много чего декомпилирует некорректно по причине своей повсеместной кривизны :) И даже без всякой обфускации - несколько примеров здесь: http://stiver-rus.livejournal.com/
     
  5. halyavin

    halyavin New Member

    Публикаций:
    0
    Регистрация:
    13 май 2005
    Сообщения:
    252
    Адрес:
    Russia
    Я бы сказал, что такой код никто не декомпилирует корректно, поскольку соотвествующей программы на java просто не существует.

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