• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Эти глупые Goto

  • Автор темы melco
  • Дата начала
Статус
Закрыто для дальнейших ответов.
M

melco

Всем привет. Скажу сразу, что я программировал на разных языках, но с Явой не приходилось мне работать.
Мне в руки попали исходники очень важной мне программы. Мне в ней кой-че нужно изменить, мелочь.
Постави я себе J2EE SDK, NetBeans IDE и думал собрать ее просто первый раз тестово, без изменений.
А вылезла мне вот такая ошибочка:
Код:
b.java:167: illegal start of expression:
if(k2 == 0) goto _L28; else goto _L27

И тут меня повергло в ужас. Я вспомнил, что еще в школе учитель информатики говорил, что использовать goto !!!!ЗАПЕЩЕНО!!!, а тут в 28 файлах исходника такая вот лажа. В одном из них 37 лейблов, естественно по всем идут goto.
Подскажите, чем можно более-мение просто, без сильно глобального рекодинга заменить конструкции goto?

Я в ауте, потому очень жду вашей помощи.

Заранее спасибо!
 
P

Pete

goto в java только для выхода из нескольких циклов используются, заменить можно условиями выхода (устанавливать флаги) и оператором break.
 
M

melco

Там конструкция вида:
Код:
		if(k2 == 0) goto _L2; else goto _L1
_L1:
g.fillRect(l1 - i2, k1 + i2, 2 * i2 + 2, 1);
i2++;
_L2:
if(i2 < j1) goto _L1; else goto _L3
_L3:
if(color2 == null)
break MISSING_BLOCK_LABEL_922;
g.setColor(color2);
g.fillRect((l1 - j1) + 2, k1 + j1, 2 * j1, 1);
if(k2 == 0)
break MISSING_BLOCK_LABEL_922;
i2 = 0;
if(k2 == 0) goto _L5; else goto _L4

ну и т.д.

Как мне сказали - это дело рук декомпилятора, но как это заставить работать?
 
P

Pradov

"учитель информатики говорил, что использовать goto !!!!ЗАПЕЩЕНО!!!, "

Бред полнейший )))
Учителя ф топку)
 
M

melco

Ага, Pradov, точно... Бред! ИСпользуй goto, удачи тебе! :)
 
I

Igorg

2.2.6 No More Goto Statements

Java has no goto statement1. Studies illustrated that goto is (mis)used more often than not simply "because it's there". Eliminating goto led to a simplification of the language--there are no rules about the effects of a goto into the middle of a for statement, for example. Studies on approximately 100,000 lines of C code determined that roughly 90 percent of the goto statements were used purely to obtain the effect of breaking out of nested loops. As mentioned above, multi-level break and continue remove most of the need for goto statements.
(http://java.sun.com/docs/white/langenv/Simple.doc2.html)
Как здесь указано, инструкции goto в Java нет вообще.
Такое месиво не удастся запустить "без сильно глобального рекодинга". Можно попробовать что-то вроде:
Код:
if (k2 == 0) {
if (i2 < j1) {
g.fillRect(l1 - i2, k1 + i2, 2 * i2 + 2, 1);
i2++;
} else {
if (color2 == null)
break MISSING_BLOCK_LABEL_922;
g.setColor(color2);
g.fillRect((l1 - j1) + 2, k1 + j1, 2 * j1, 1);
if (k2 == 0)
break MISSING_BLOCK_LABEL_922;
i2 = 0;
if(k2 == 0) [i]goto _L5[/i]; else [i]goto _L4[/i];
}
} else {
g.fillRect(l1 - i2, k1 + i2, 2 * i2 + 2, 1);
i2++;
}
То есть просто вместо goto вставляется текст, на который этот самый goto указывает. Оговорюсь сразу -- это плохой вариант, так как пропускаются некоторые куски, которые могли бы последовательно выполниться, а из-за if-ов не выполнятся.
break действительно используется для выхода из циклов, вроде как любой вложенности. Почитай поподробнее.
 
B

Black horse

goto - является зарезервированным словом языка, но не используется(по крайней мере в 5-й jave).
А задача, сродни олимпиадной. Есть такой критерий: любой код можно написать без goto, также можно написать без циклов и операторных скобок с помощью goto. Так что тебе надо понять логику и goto заменить на циклы, операторные скобки, а возможно и дополнительные переменные.
 
A

Andron1234

оператор goto является оператором безусловного перехода, но безусловность может быть относительной, если добавить функцию перехода по переменной, а написание кода бедет легче чем с оператором case. так что очень хороший оператор, просто языки программирования ещё создаются для крестьян(их легче разводить), а хороших ,практически, в массах нету, хоть сам делай.
 
I

Igorg

Если нужны безусловные относительные переходы -- пользуйтесь ассемблером. Что касается крестьян, то чтобы считать крестьянами сотрудников фирмы Sun, да и многих других высокопрофессиональных теоретиков программирования, которые уже пару десятков лет не рекомендуют использовать goto -- надо как минимум уже создать "хороший" язык программирования и написать компилятор к нему.
 
A

Andron1234

извините, я сварщик ручной дуговой сварки, преимущественно работаю на монтаже (лучше для сварщика места быть не может) и создал я, считаю, хорошую коробку передач(и не только, вобщем способ, дающий право на жизнь множеству новых механизмов), где шестерни не разъеденяются, что позволит делать (надеюсь) робототехнику с одним двигателем на все исполнительные механизмы, в полне пригодную для эксплуатации даже в самых жёстких условиях.
языками программирования же интересуюсь для защиты авторского права, после кидалова в ФИПСе, и для самообучения на новом,для себя, уровне с помощью созданных собою поисковых систем (пока осваиваю необходимые материалы)с функциями не вошедшими в функции обычных поисковых серверов, и даже предложения которых остались их службами без внимания. Короче надо мне и всё!!! И безусловный переход по переменной хочу и баста!!! :). Такие дела.
 
I

Igorg

Ок. Я пока занимаюсь усовершенствованием своих знаний в имеющихся языках
 
P

Pasha

Для: Andron1234

Письмо Дейкстры было написано 39 лет назад...
Функция перехода по переменной...и что в эту переменную надо будет записывать? Неужели адрес?OMG, а как перейти обратно?
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!