Jasper compiler bug - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > Полезное / Common > Программирование / Programming > Java

Java В данном форуме вы сможете найти много полезной информации по платформе Java. Подробные статьи, исходные коды и конечно учебники как для новичков так и профессиональных Java разработчиков вы найдёте здесь. Если у вас есть вопрос или хотите поделится своими наработками, пожалуйста, делайте это в этой теме.

Ответ
Опции темы
Непрочитано 19.03.2015, 11:25   #1
Аватар для n3k0nation
Antihero

Автор темы (Топик Стартер) Jasper compiler bug

Недавно, я со своим хорошим другом обнаружил достаточно интересный баг в джаспере. Причем мы пришли к выводу, что это баг компилятора.

Для примера, такой код:
Код:
		List<Long> list = new ArrayList<>();
		
		for(long a : list) {
			
		}
Скомпилируется javac'ом в такой:
Код:
...
    21  invokeinterface java.util.Iterator.next() : java.lang.Object [28] [nargs: 1]
    26  checkcast java.lang.Long [34]
    29  invokevirtual java.lang.Long.longValue() : long [36]
    32  lstore_2
...
Как видно, у нас все хорошо, наш лонг сторится. Теперь же, для сравнения код джаспера:
Код:
...
   86:	invokeinterface	#117,  1; //InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
   91:	checkcast	#122; //class java/lang/Long
   94:	invokevirtual	#124; //Method java/lang/Long.longValue:()J
   97:	pop
...
Как видно, наш джаспер решил зачем-то вытаскивать со стека какие-то значения и вообще забил на наш лонг. При этом интересен тот факт, что на стеке может ничего не оказаться, из-за чего мы получим ошибку верификации байткода.

Теперь попробуем такой код:
Код:
		List<Long> list = new ArrayList<>();
		
		for(Long a : list) {
			
		}
Javac:
Код:
    19  invokeinterface java.util.Iterator.next() : java.lang.Object [28] [nargs: 1]
    24  checkcast java.lang.Long [34]
    27  astore_2
Jasper:
Код:
   86:	invokeinterface	#117,  1; //InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
   91:	checkcast	#122; //class java/lang/Long
   94:	pop
Опять та же песня. Что самое интересное, на второй позиции (astore_2), у нас реально ничего нет (по Jasper), видимо ребята не любят число два х)
Нам удалось добиться таки, что бы верификатор нормально отрабатывал, с помощью того, что мы кладем на стек какое-то говно. Это конечно не выход, но когда висит продакшен - очень даже

Кстати говоря, такой баг проявляется только если не использовать данную локальную переменную. Скорее всего, авторы джаспера делали оптимизацию, но малька накосячили.

Добавлено через 39 минут
Для примера, как джаспер откомпилил код вида for(long a : list) { System.println(a); }
Код:
   91:	checkcast	#122; //class java/lang/Long
   94:	invokevirtual	#124; //Method java/lang/Long.longValue:()J
   97:	lstore	8
Тут все ок, байткод не чищенный, а вот в примерах, где переменная не используется, видимо байткод кто-то подчистил (привет анциент и ребеллион тим!).
__________________
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.

Последний раз редактировалось n3k0nation; 19.03.2015 в 12:14. Причина: Добавлено сообщение
n3k0nation вне форума Ответить с цитированием
Ответ

Метки
compiler, jasper, javac, баг, разбор полетов


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибки при загрузке ГС Hotaka Lineage II 16 09.11.2012 16:14
Ошибка ГС! keksar Серверная часть 29 21.02.2011 20:55
Крепости (осады) Romanz Серверная часть 125 31.07.2010 18:12
баги и недочёты сервака Devilop Серверная часть 21 03.06.2010 23:50
Зависает после выбора сервера! Nales Серверная часть 8 09.05.2010 12:55


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 18:21. Часовой пояс GMT +3.

Вверх