![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Chingachguk |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
А вот программерам, написавшим нечто, что допускает выполнения кода в стеке (переполнение буфера), как-то не получается порекомендовать пользователям "пойти поучиться в школе", а приходится быстро все чинить ;) Не, ну я понимаю, что тут совсем другое дело. Компиллятор изначально позиционируется как прога, предназначенная для работы в "неагрессивной" обстановке, т.е. пользователи - нормальные люди, которые хотят скомпиллить свою программу а не завесить компиллятор любыми способами. Как я понял, речь не о том, что "я вот счас круто написал тут лабуды и все красиво подохло". Речь о том, что случайная описка приводит к непонятным сообщениям, а, возможно, к перезапуску машины с риском потерять набранный код... Вот я имею сейчас дело с одним си-компиллятором (txo). Эта норовистая штука. Достаточно написать "нестандартный" символ среди набранного текста из 10-50 строк в разных модулях как бац ! -не могу скомпиллировать и все. Никаких сообщений, ничего. Приходится последовательно откатываться. Или иногда описка (скажем, потеря "}") приводит к куче "полезных" сообщений с финальным "не хватает памяти чтобы вывести все ошибки". Тогда как в паскале (вроде и в дельфи, я не писал) компиллятор совершенно правильно останавливается на первой же синтаксической ошибке. К тому же
не так уж и беспомощен. Он имеет все шансы установить SEH и т.п. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||
|
|||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Вот, Мрак, иди, пожалуйста, и учись, прежде чем тут гнуть пальцы. Случаи, которые я приводил - из жизни - просто я урезал код до такой степени, чтобы не было лишнего, но чтобы глюк остался. Но изначально это был ОСМЫСЛЕННЫЙ код. Ты думаешь я сидел тут маразмом страдал, подбирал строки бессмысленные, чтобы вылез баг ? - Ошибаешься... И причем ты тут про оптимизатор сказал ? Я что, должен еще заботиться, как бы тут оптимизатору туго не пришлось ? Короче, если у тебя есть доводы - говори, а не швыряйся терминами. А то получается, что это про тебя: "Я знаю карате, айкидо, дзюдо ... и другие китайские слова!"... -------------------- С уважением, г-н Посол. |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Седьмая Делфи компилирует нормально следующий код:
Обратите внимание на запятую после апострофа. Так работает везде где мы пробывали - в сочитании апостроф-запятая-правая скобка запятая игнорируется. -------------------- Волны гасят ветер... |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Fantasist - Прикольно! Я такого раньше не замечал...
Из этой же оперы - хотя это и не дырка, но смотрится немного странно:
.) = ] (. = [ Это сообщение отредактировал(а) p0s0l - 30.12.2003, 09:44 -------------------- С уважением, г-н Посол. |
|||
|
||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
Если мне не изменяет память, это пошло с очень древних времен, когда не во всех системах можно было ввести символы [ и ]. Вот и были придуманы метапоследовательности их заменяющие. Не знал что Delphi их еще поддерживает -------------------- Все знать невозможно, но хочется |
|||
|
||||
| Мрак |
|
||||||
|
Unregistered |
Ну так кто ж тем прогаммерам виноват
Я понимаю что случайная описка валящая компилятор ни есть гуд. Но чтот в исходном сообщении я случайной описки не видел. Там было только агрессивное использования ассемблера с наглыми передачами управления и разрушением стека и наглое приведение типов с попыткой декрементировать полученное значение. Если второе с весьма большим натягом и можно назвать опиской то первое вообще ни в какие ворота не лезет.
Не имеет. Шансы имеет програмер. Но видимо такого никто не ожидал - видать не заложились |
||||||
|
|||||||
| МРак |
|
||||||
|
Unregistered |
С этого места подробнее плз. Чему и у кого.
Осмысленный гришь... ну-ну.... заметно... что первый, что второй... А для недоученных то есть меня можно пояснить сокровенный смысл не того, что вырезано, а того что осталось. А то я уж совсем плох он такие закорюки чтобы что-то работало да еще и на ассемблере,
Оптимизатор как раз к ассемблерным вставкам довольно хреного относится. Причем в любом языке. |
||||||
|
|||||||
| p0s0l |
|
||||||||||||||||||||||||||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
МРак, интересно, что приходится тут объяснять, как же получился такой код... Только когда я тебе расскажу смысл кода, ты мне скажешь, чем же это спасает ситуацию...
Смысл в том, что мне надо вычислить ТОЧНЫЙ размер кода процедуры Proc1. Первоначальный вариант:
Этот способ мог давать погрешность до 3 байт, т.к. начало тел процедур выравнено по 4-байтной границе. А в ходе переборов разных вариантов набралось такое:
Вылезает Internal Error. Смысл тот же самый, но не компилируется. Уж извини меня, МРак, такого тупого программера, ведь только сел за Дельфи, а нигде не написано, как реализовать нужную мне задачу. Может ты мне скажешь, как же узнать размер процедуры, раз ты такой знаток Дельфей, компиляторов и асмов - это ведь тебе раз плюнуть, а мне придется мараться, глюки случайно находить то тут, то там, и я же буду, самое главное, виноват в этих глюках... Короче, из-за неточности решил попробовать сделать через одно место. По смыслу метка - это адрес. Вот я и сделал так:
Но так нельзя... Вот если бы ввели бы возможность узнавания адреса метки... Ради эксперимента решил посмотреть, что будет, если:
Вот тут дельфи гнется, и окно редактора кода в дельфи становится глухим на нажатие кнопок. Извиняюсь, МРак, конечно, за абсурдность идеи, видимо не дано быть мне программером, DVA мне это говорил, теперь ты говоришь... Все, теперь буду трактористом. В итоге я сделал вычисление размера процедуры по-трактористски:
Но опять же, так как это сделано по-трактористски, то не компилится (internal error)... Найди разницу, МРак, и скажи, в чем принципиальное отличие, этот вариант компилится и работает:
И к чему ты это сказал ? Не использовать асм ? Спасибо! Или не использовать дельфи, а чисто асм ? Тоже спасибо! А теперь, на десерт
Очень посмешил!
Хоть убей, но рыл-рыл, перерыл, но ниодной передачи управления так и не нашел!... А нет, что же я ? Ведь там есть такая процедура: Procedure Proc1: nop ret Возврат из процедуры - это передача управления! Притом наглая! Ведь до ret'а нет никаких осмысленных действий! Что это за процедура, которая ничего не делает?
Ты можешь себе представить такое, что там в последствии была инструкция POP! Или ты забыл про такую команду, как POP, или я не написал, что код урезан ?
Какой же я наглец! Привести pointer к cardinal - это не по-программерски! Это нагло, по-ламерски, и вообще ерунда какая-то!
Dec от слова Decrement, ты абсолютно прав. Но ты забыл сказать, что это НАГЛАЯ попытка декремента! Короче, МРак, спасибо, что объяснил построчно, что же я там накалякал.
Да... Куда уж мне, бесталантному трактористу-програмисту-самоучке тягаться с таким титаном программирования, как МРак, который своим зорким взором смотря вдаль (правда не слыша, что ему кричат в упор) сразу выцепил из толпы "ламака" (т.е. меня).
По-моему, вывод один - тут есть только один индивид (МРак), который строит из себя супер-программера, которому влом объяснять азы тупым программерам (таким же тупым как и Борландовцы?), типа меня (p0s0l). Про тупость Борланда - это твои слова. Я без всякого злого умысла выложил то, что накопал (найди хоть слово в адрес дельфи или Борланда), никак не думая, что найдется умник МРак, и начнет говорить, что код абсурдный, противоречит всем законам физики и т.д. Но тема-то создана для сбора глюков. Но никак не для спора на темы о правильности писания кода. Неважно, правильно я сделал, или нет, написав ту лажу-нелажу, но главное, что Дельфи от этого не защищен. Особенно интересуют Internal Error-ы. Например, помню был случай, когда прогал то ли на D5, то ли на D6. И там писал процедурину, где было два вложенных цикла, в циклах - пара вложенных условий, пара case'ов, короче, такая вложенность begin..end'ов. Вставил break, да не туда, получилось вне цикла. При компиляции выдавалось что-то вроде Internal Error, но курсор на строку с break'ом не ставился. Потерял полчаса прежде чем догадался, что дело было в Break. (Умный МРак скажет - тупой программер, вот так долго и искал...). Вот, теперь (В D7) эта ошибка уже проименована, и догадаться в чем дело не составляет труда... И поэтому, МРак, не вижу ничего плохого в том, чтобы говорить об ошибках в Delphi, может, это кому-то поможет, и может, это кому-то интересно. Короче, МРак, жду твоего ответа! Уж очень с тобой интересно общаться, настроение умеешь поднимать! -------------------- С уважением, г-н Посол. |
||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Уфф, не думал что столько выйдет! Долго не бывал на форуме - сказывается...
-------------------- С уважением, г-н Посол. |
|||
|
||||
| Полудненко Олег |
|
|||
|
Українець ![]() ![]() Профиль Группа: Участник... Сообщений: 556 Регистрация: 13.8.2003 Репутация: 1 Всего: -11 |
ещё если после какого-нить опреатора стоит end, то после этого самого оператора можно не ставить ; и всё работает ОК:
|
|||
|
||||
| Fedor |
|
|||
![]() Днепрянин ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2090 Регистрация: 8.2.2003 Где: Великий Репутация: нет Всего: 32 |
Полудненко Олег Не понял... Ты думаешь, что это - глюк дельфи? На самом деле, это - не глюк, а наоборот возможность. Наоборот считается, что ";" - это отдельный оператор, и если его поставить перед end, то скорость работы программы уменьшится. Ненамного правда.
-------------------- Мы - Днепряне. Мы всех сильней. |
|||
|
||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
По поводу ; перед end.
Дело в том, что язык Pascal лежащий в основе Delphi относится к языкам в которых символ ; является разделителем операторов. А поскольку end не является оператором, то и ; ставить перед ним нет надобности. А еще, в Pascal'е есть понятие пустой оператор, поэтому, можно ставить подряд несколько ;, ну и конечно ставить ; перед end. Причем замечу, наличие символов ; перед end, а так-же их количество на скорость работы программы не влияет. Достаточно взлянуть на код генерируемый компилятором. А для справки, есть языки в которых символ ; служит символом завершающим оператор. В таких языках пропуск ; недопустим. -------------------- Все знать невозможно, но хочется |
|||
|
||||
| Fedor |
|
|||
![]() Днепрянин ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2090 Регистрация: 8.2.2003 Где: Великий Репутация: нет Всего: 32 |
Петрович Согласен. Я ошибался.
-------------------- Мы - Днепряне. Мы всех сильней. |
|||
|
||||
| dm9 |
|
|||
![]() Дмитрий Копытин ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 3876 Регистрация: 22.7.2002 Где: Москва Репутация: 6 Всего: 137 |
Насчёт ";":
был у меня как-то такой глюк в 5-х, то ли 6-х Делфях... Стоял у меня перед end'ом оператор, после него точки с запятой не было. Программа не работала. После часа экспериментов до меня наконец дошло, что этот последний оператор компилятор не видит! Поставил точку с запятой - всё заработало. Теперь всегда ставлю ";" перед "end"... |
|||
|
||||
| Полудненко Олег |
|
|||
|
Українець ![]() ![]() Профиль Группа: Участник... Сообщений: 556 Регистрация: 13.8.2003 Репутация: 1 Всего: -11 |
Ещё можно создавать переменные следующего вида integer:string; Тоесть давать имена переменным типа iteger, write и т.д.
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |