| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Дыры в Delphi |
| Автор: p0s0l 24.12.2003, 23:32 | ||||
| Щас буду коллекционировать глюки и недоделки в Delphi. А то обычно раз в месяц встречаюсь с какими-то непонятными глюками... ------------------- Глюк: Создаю новый проект, вытаскиваю Button, и пишу такое:
Попытка компиляции обламывается с Access Violation и дальше не работает клава в окне редактора... Перезапуск Delphi или перезагрузка компа не влияют никак на успешность компиляции... ------------------- Недоделка: Тоже создаю новый проект и пишу:
На строке Dec выдается безымянная ошибка Internal C1030. ------------------- Если бы я начал постить баги полгода назад, то, наверное, уже было бы страница или две... Щас только ничего вспомнить из того не могу... Если что, тоже постите сюда баги... |
| Автор: zemfir 24.12.2003, 23:55 |
| для таких случаев хорошо писать версию дельфи |
| Автор: p0s0l 25.12.2003, 00:03 |
| Седьмая... |
| Автор: zemfir 25.12.2003, 00:12 |
| ну дык, если планируется, что это кто-то будет использовать, то надо писать: Delphi (полный номер версии) билд такой-то что установлено и т.п. Операционная система такая-то билд такой-то глюк проявляется при таких-то условиях. Проверен в таких-то условиях и т.п. В общем стандартный баг репорт Про ОС может и лишнее, но в остальном это нужно. зы, какие-то Вы экстремальные вещи применяете |
| Автор: Georg4 25.12.2003, 01:39 |
| У меня был баг, если ты берешь из инета страницу через NMHTTP, а компьютер отключен от инета, виснет проект, а когда его отключаешь виснет дельфи, а когда её сбрасываешь, появляется системная ошибка експлорера |
| Автор: DonPager 27.12.2003, 21:55 | ||||
Странно но:
при этом не(!) возникает ошибки - почему при
... при этом тоже нет ошибки, но при попытке C := A[9,10] - ошибка есть ... такое возникает только смногомерными.. |
| Автор: <Spawn> 28.12.2003, 05:47 | ||
DonPager
|
| Автор: DonPager 28.12.2003, 11:07 | ||
| <Spawn> с динамическими я ещё смиряюсь, но почему нет ошибки когда
вот для меня что самое обломное... |
| Автор: <Spawn> 28.12.2003, 13:00 |
| А ты попробуй присвоить значение A[9, i] и будет тебе Access Violetion. |
| Автор: p0s0l 28.12.2003, 14:36 | ||||
Тут не должен по смыслу вылезать Access Violation, что при записи, что при чтении. Шанс исключения очень мал... При приведенном выше чтении массива на самом деле будет читаться следующая переменная, стоящая за этим массивом. Также, если включить опцию Range Checking {$R+}, то в коде при обращении к массиву через переменные будет сгенерирована проверка границ... Вот примерчик еще:
|
| Автор: Полудненко Олег 28.12.2003, 19:11 |
| Спокойно, у меня при дебаги Квалификационного проекта (примерно 15000 строк кода) довольно часто на цилке в котором идёт исключительно присваиание различных переменных типа integer довольно часто выскакивает Синий экран смерти, или Делфа просто в мясо вешает всю систему... |
| Автор: dr.ZmeY 28.12.2003, 21:01 |
| Бывает, что вешает кучу хинтов, будто бы глобальная переменная не используется... при чем ссылается на все места, все функции где я юзаю эту переменную... |
| Автор: DonPager 28.12.2003, 21:06 | ||
вот если бы была ошибка - я бы не возмущался... вместо ошибки в С идёт следуящая переменная.... в общем как и писал p0s0l... а вот про {$R+} не знал... |
| Автор: MPak 29.12.2003, 22:03 | ||||||
1) Интересно конечно... я б на месте багланда такие б программы не только не компилировал а рекомендовал бы пойти программеру в школу почитать чтонибудь из азов и теории компиляторов чтобы не повадно бало мешать ассемблер с полным непониманием принципов компиляции и оптимизатора 2) в журнале Техника-Молодежи годов так 80-ых были статьи как ушатать програмируемый калькулятор.... неудивительно что компилятор на порядки более сложный чем ПК (калькулятор) ушатать тоже можно.... вопрос в том - зачем програмировать как попало и делать из себя вид очень умного, а народ в багланде типа очень глупый.... сей пост только показывает полную эквивалентность автора поста к программерам багланда - чего ж ждать в результате 3) Не стоит постить свои баги.... они по большому счету не очень интересны....лучше почитать литературу .... подучиться чтобы понять почему отквоченый бред, а он таковой по определени и есть, не компилируется нормально |
| Автор: MPak 29.12.2003, 22:09 | ||
А пример привести религия не позволяет? Это так много чего можно написать вплоть до того что у меня типа 2 + 2 = 5 |
| Автор: Chingachguk 29.12.2003, 22:41 | ||||
А вот программерам, написавшим нечто, что допускает выполнения кода в стеке (переполнение буфера), как-то не получается порекомендовать пользователям "пойти поучиться в школе", а приходится быстро все чинить ;) Не, ну я понимаю, что тут совсем другое дело. Компиллятор изначально позиционируется как прога, предназначенная для работы в "неагрессивной" обстановке, т.е. пользователи - нормальные люди, которые хотят скомпиллить свою программу а не завесить компиллятор любыми способами. Как я понял, речь не о том, что "я вот счас круто написал тут лабуды и все красиво подохло". Речь о том, что случайная описка приводит к непонятным сообщениям, а, возможно, к перезапуску машины с риском потерять набранный код... Вот я имею сейчас дело с одним си-компиллятором (txo). Эта норовистая штука. Достаточно написать "нестандартный" символ среди набранного текста из 10-50 строк в разных модулях как бац ! -не могу скомпиллировать и все. Никаких сообщений, ничего. Приходится последовательно откатываться. Или иногда описка (скажем, потеря "}") приводит к куче "полезных" сообщений с финальным "не хватает памяти чтобы вывести все ошибки". Тогда как в паскале (вроде и в дельфи, я не писал) компиллятор совершенно правильно останавливается на первой же синтаксической ошибке. К тому же
не так уж и беспомощен. Он имеет все шансы установить SEH и т.п. |
| Автор: p0s0l 29.12.2003, 23:28 | ||
Вот, Мрак, иди, пожалуйста, и учись, прежде чем тут гнуть пальцы. Случаи, которые я приводил - из жизни - просто я урезал код до такой степени, чтобы не было лишнего, но чтобы глюк остался. Но изначально это был ОСМЫСЛЕННЫЙ код. Ты думаешь я сидел тут маразмом страдал, подбирал строки бессмысленные, чтобы вылез баг ? - Ошибаешься... И причем ты тут про оптимизатор сказал ? Я что, должен еще заботиться, как бы тут оптимизатору туго не пришлось ? Короче, если у тебя есть доводы - говори, а не швыряйся терминами. А то получается, что это про тебя: "Я знаю карате, айкидо, дзюдо ... и другие китайские слова!"... |
| Автор: Fantasist 30.12.2003, 03:11 | ||
Седьмая Делфи компилирует нормально следующий код:
Обратите внимание на запятую после апострофа. Так работает везде где мы пробывали - в сочитании апостроф-запятая-правая скобка запятая игнорируется. |
| Автор: p0s0l 30.12.2003, 09:42 | ||
| Fantasist - Прикольно! Я такого раньше не замечал... Из этой же оперы - хотя это и не дырка, но смотрится немного странно:
.) = ] (. = [ |
| Автор: Петрович 30.12.2003, 11:04 | ||
Если мне не изменяет память, это пошло с очень древних времен, когда не во всех системах можно было ввести символы [ и ]. Вот и были придуманы метапоследовательности их заменяющие. Не знал что Delphi их еще поддерживает |
| Автор: Мрак 7.1.2004, 01:02 | ||||||
Ну так кто ж тем прогаммерам виноват
Я понимаю что случайная описка валящая компилятор ни есть гуд. Но чтот в исходном сообщении я случайной описки не видел. Там было только агрессивное использования ассемблера с наглыми передачами управления и разрушением стека и наглое приведение типов с попыткой декрементировать полученное значение. Если второе с весьма большим натягом и можно назвать опиской то первое вообще ни в какие ворота не лезет.
Не имеет. Шансы имеет програмер. Но видимо такого никто не ожидал - видать не заложились |
| Автор: МРак 7.1.2004, 01:17 | ||||||
С этого места подробнее плз. Чему и у кого.
Осмысленный гришь... ну-ну.... заметно... что первый, что второй... А для недоученных то есть меня можно пояснить сокровенный смысл не того, что вырезано, а того что осталось. А то я уж совсем плох он такие закорюки чтобы что-то работало да еще и на ассемблере,
Оптимизатор как раз к ассемблерным вставкам довольно хреного относится. Причем в любом языке. |
| Автор: p0s0l 9.1.2004, 23:17 | ||||||||||||||||||||||||||||
| МРак, интересно, что приходится тут объяснять, как же получился такой код... Только когда я тебе расскажу смысл кода, ты мне скажешь, чем же это спасает ситуацию... Смысл в том, что мне надо вычислить ТОЧНЫЙ размер кода процедуры 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 9.1.2004, 23:18 |
| Уфф, не думал что столько выйдет! Долго не бывал на форуме - сказывается... |
| Автор: Полудненко Олег 9.1.2004, 23:47 | ||
ещё если после какого-нить опреатора стоит end, то после этого самого оператора можно не ставить ; и всё работает ОК:
|
| Автор: Fedor 10.1.2004, 00:37 |
| Полудненко Олег Не понял... Ты думаешь, что это - глюк дельфи? На самом деле, это - не глюк, а наоборот возможность. Наоборот считается, что ";" - это отдельный оператор, и если его поставить перед end, то скорость работы программы уменьшится. Ненамного правда. |
| Автор: Петрович 10.1.2004, 21:50 |
| По поводу ; перед end. Дело в том, что язык Pascal лежащий в основе Delphi относится к языкам в которых символ ; является разделителем операторов. А поскольку end не является оператором, то и ; ставить перед ним нет надобности. А еще, в Pascal'е есть понятие пустой оператор, поэтому, можно ставить подряд несколько ;, ну и конечно ставить ; перед end. Причем замечу, наличие символов ; перед end, а так-же их количество на скорость работы программы не влияет. Достаточно взлянуть на код генерируемый компилятором. А для справки, есть языки в которых символ ; служит символом завершающим оператор. В таких языках пропуск ; недопустим. |
| Автор: Fedor 11.1.2004, 00:27 |
| Петрович Согласен. Я ошибался. |
| Автор: dm9 11.1.2004, 19:31 |
| Насчёт ";": был у меня как-то такой глюк в 5-х, то ли 6-х Делфях... Стоял у меня перед end'ом оператор, после него точки с запятой не было. Программа не работала. После часа экспериментов до меня наконец дошло, что этот последний оператор компилятор не видит! Поставил точку с запятой - всё заработало. Теперь всегда ставлю ";" перед "end"... |
| Автор: Полудненко Олег 13.1.2004, 22:17 |
| Ещё можно создавать переменные следующего вида integer:string; Тоесть давать имена переменным типа iteger, write и т.д. |
| Автор: Frikazoid 14.1.2004, 01:58 | ||
Я бы не стал так писать! У меня часто бывает, что операции с Result оканчиваются интернал еррором! т.е. по возможности надо пользовать доп. переменные и только по концухе Result:=.... Может я и ошибаюсь, но это ИМХО! |
| Автор: Петрович 14.1.2004, 03:29 | ||||||||
И очень глубоко (прошу не рассматривать как наезд). Дело в том, что Result, это ни что иное как локальная переменная, содержимое которой возвращается как результат функции. Сам я очень часто использую Result как локальную переменную. Вот пару примеров из моей библиотеки, которая работает у меня уже несколько лет:
это совсем просто.
тут посложнее. Ну и из совсем старых
Так что не сомневайтесь, а смело используйте. |
| Автор: p0s0l 14.1.2004, 12:17 | ||
| Frikazoid, даже сам Borland частенько юзает Result как обычную переменную... Загляни в SysUtils или StrUtils... Вот пример: (из StrUtils)
|
| Автор: Frikazoid 14.1.2004, 13:21 |
| Сори перепутал с паскалем! |
| Автор: p0s0l 14.1.2004, 13:24 | ||
Нельзя использовать в качестве имен зарезервированные слова типа case, string, короче которые жирным пишутся. Про типы: интересно, почему string - зарезервированное слово, а byte, integer, word, boolean, real, pointer и др. типы - нет ? |
| Автор: Петрович 14.1.2004, 18:14 | ||
|
| Автор: December 14.1.2004, 23:21 | ||
|
| Автор: stab 14.1.2004, 23:31 | ||||||
Аналогично... было бы круто если бы можно было писать:
может это и было в планах у Борланд? |
| Автор: p0s0l 15.1.2004, 07:10 | ||||||||
cully, вот ты почти и ответил... Integer и др. типы - простые типы, ничего кроме имени типа не надо указывать. А у стринга можно еще длину указывать... |
| Автор: Mpak 18.1.2004, 03:57 | ||||
Остальные извращения с инструментом не предназначенным для системного программирования покипаны. Всего пара глупых вопросов 1. На кой его знать точно? С чего вдруг погрешность от выравнивания стала критична? 2. На кой это нужно определять в рантайме? |
| Автор: p0s0l 18.1.2004, 13:18 | ||||||
2. На кой это нужно определять в рантайме? [/QUOTE]
На той, что при компиляции никак не узнать размер. А если вначале засунуть это в константу, то будет не то, т.к. эту процедуру я меняю часто, и каждый раз переузнавать размер как-то в лом.
Мрак, как видно, ты и дальше пытаешься лезть в дебри... Вот глупый вопрос - а зачем тебе знать это ? Разве это что-то изменит ? У меня была такая задача, и всё, неважно, зачем это нужно было. Но это было нужно. Точка.
Ну-ну... В книжке, наверное, вычитал словечки "Компилятор", "Оптимизатор", "Системное программирование" ? Продолжай в том же духе. |
| Автор: Guest 18.1.2004, 20:25 | ||||||||||||
Ясно. Про MAP файлы никто не слышал.....
Тоже ясно. Как ... задача была сформулирована так .... она и решается. Пропущеный наречия по тексту каждый волен расставить сам. Вот бы всеж узнать на кой. А то кроме хакерского пальцегнутия и представить то не могу ЗАЧЕМ в дельфях узнавать размер процедуры, с точностью до байта, да еще и такими способами.
Ну я хоть читаю... Мне хоть не стыдно за свой код. |
| Автор: p0s0l 23.1.2004, 19:41 |
| Ладно, Мрак, высказывание про map-файлы (и некоторые другие предыдущие моменты) поставило точку в определении твоего истинного уровня знаний: map-файле Delphi, как ты мог бы заметить, если бы хоть раз их видел в живую, а не в умной книжке, не указан размер процедуры, а указан только адрес... Увы... Других способов решения моей задачи ты не представил, а только допытываешься до вопроса: зачем это надо ? Короче продолжать это бессмысленно. |