Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дыры в Delphi 
:(
    Опции темы
Chingachguk
Дата 29.12.2003, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата

1)
Интересно конечно... я б на месте багланда
такие б программы не только не компилировал
а рекомендовал бы пойти программеру в школу
почитать чтонибудь из азов и теории компиляторов
чтобы не повадно бало мешать ассемблер с полным
непониманием принципов компиляции и оптимизатора


А вот программерам, написавшим нечто, что допускает выполнения кода в стеке (переполнение буфера), как-то не получается порекомендовать пользователям "пойти поучиться в школе", а приходится быстро все чинить ;)

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

Как я понял, речь не о том, что "я вот счас круто написал тут лабуды и все красиво подохло". Речь о том, что случайная описка приводит к непонятным сообщениям, а, возможно, к перезапуску машины с риском потерять набранный код...

Вот я имею сейчас дело с одним си-компиллятором (txo). Эта норовистая штука. Достаточно написать "нестандартный" символ среди набранного текста из 10-50 строк в разных модулях как бац ! -не могу скомпиллировать и все. Никаких сообщений, ничего. Приходится последовательно откатываться. Или иногда описка (скажем, потеря "}") приводит к куче "полезных" сообщений с финальным "не хватает памяти чтобы вывести все ошибки". Тогда как в паскале (вроде и в дельфи, я не писал) компиллятор совершенно правильно останавливается на первой же синтаксической ошибке.

К тому же

Цитата
компилятор на порядки
более сложный чем ПК (калькулятор)


не так уж и беспомощен. Он имеет все шансы установить SEH и т.п.


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
p0s0l
Дата 29.12.2003, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
Интересно конечно... я б на месте багланда
такие б программы не только не компилировал
а рекомендовал бы пойти программеру в школу
почитать чтонибудь из азов и теории компиляторов
чтобы не повадно бало мешать ассемблер с полным
непониманием принципов компиляции и оптимизатора

Вот, Мрак, иди, пожалуйста, и учись, прежде чем тут гнуть пальцы.
Случаи, которые я приводил - из жизни - просто я урезал код до такой степени, чтобы не было лишнего, но чтобы глюк остался. Но изначально это был ОСМЫСЛЕННЫЙ код. Ты думаешь я сидел тут маразмом страдал, подбирал строки бессмысленные, чтобы вылез баг ? - Ошибаешься...

И причем ты тут про оптимизатор сказал ? Я что, должен еще заботиться, как бы тут оптимизатору туго не пришлось ?

Короче, если у тебя есть доводы - говори, а не швыряйся терминами. А то получается, что это про тебя: "Я знаю карате, айкидо, дзюдо ... и другие китайские слова!"...



--------------------
С уважением, г-н Посол.
PM   Вверх
Fantasist
Дата 30.12.2003, 03:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Седьмая Делфи компилирует нормально следующий код:

Код


List.Add('Slovo',);




Обратите внимание на запятую после апострофа. Так работает везде где мы пробывали - в сочитании апостроф-запятая-правая скобка запятая игнорируется.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
p0s0l
Дата 30.12.2003, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Fantasist - Прикольно! Я такого раньше не замечал...

Из этой же оперы - хотя это и не дырка, но смотрится немного странно:
Цитата
var a : array [0..3.) of integer;

.) = ]
(. = [


Это сообщение отредактировал(а) p0s0l - 30.12.2003, 09:44


--------------------
С уважением, г-н Посол.
PM   Вверх
Петрович
Дата 30.12.2003, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата
.) = ]
(. = [

Если мне не изменяет память, это пошло с очень древних времен, когда не во всех системах можно было ввести символы [ и ]. Вот и были придуманы метапоследовательности их заменяющие. Не знал что Delphi их еще поддерживает smile.gif


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Мрак
Дата 7.1.2004, 01:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата

А вот программерам, написавшим нечто, что допускает выполнения кода в стеке (переполнение буфера), как-то не получается порекомендовать пользователям "пойти поучиться в школе", а приходится быстро все чинить ;)


Ну так кто ж тем прогаммерам виноват smile.gif

Цитата

Как я понял, речь не о том, что "я вот счас круто написал тут лабуды и все красиво подохло". Речь о том, что случайная описка приводит к непонятным сообщениям, а, возможно, к перезапуску машины с риском потерять набранный код...


Я понимаю что случайная описка валящая компилятор ни есть гуд. Но чтот в исходном сообщении я случайной описки не видел. Там было только агрессивное использования ассемблера с наглыми передачами управления и разрушением стека и наглое приведение типов с попыткой декрементировать полученное значение. Если второе с весьма большим натягом и можно назвать опиской то первое вообще ни в какие ворота не лезет. sad.gif

Цитата

не так уж и беспомощен. Он имеет все шансы установить SEH  и т.п.


Не имеет. Шансы имеет програмер. Но видимо такого никто не ожидал - видать не заложились smile.gif

  Вверх
МРак
Дата 7.1.2004, 01:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
Вот, Мрак, иди, пожалуйста, и учись, прежде чем тут гнуть пальцы.


С этого места подробнее плз. Чему и у кого.

Цитата
Случаи, которые я приводил - из жизни - просто я урезал код до такой степени, чтобы не было лишнего, но чтобы глюк остался. Но изначально это был ОСМЫСЛЕННЫЙ код.


Осмысленный гришь... ну-ну.... заметно... что первый, что второй...
А для недоученных то есть меня можно пояснить сокровенный
смысл не того, что вырезано, а того что осталось. А то я уж совсем
плох withstupid.gif , видимо впрочем как и багланд, оказывается надо писать
он такие закорюки чтобы что-то работало да еще и на ассемблере,

Цитата

И причем ты тут про оптимизатор сказал ? Я что, должен еще заботиться, как бы тут оптимизатору туго не пришлось ?


Оптимизатор как раз к ассемблерным вставкам довольно хреного
относится. Причем в любом языке.



  Вверх
p0s0l
Дата 9.1.2004, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



МРак, интересно, что приходится тут объяснять, как же получился такой код... Только когда я тебе расскажу смысл кода, ты мне скажешь, чем же это спасает ситуацию...

Смысл в том, что мне надо вычислить ТОЧНЫЙ размер кода процедуры Proc1.
Первоначальный вариант:
Код
procedure Proc1;
begin
.......
end;

function Proc1Len : Cardinal;
begin
  Result := Cardinal(@Proc1Len) - Cardinal(@Proc1);
end;

Этот способ мог давать погрешность до 3 байт, т.к. начало тел процедур выравнено по 4-байтной границе. А в ходе переборов разных вариантов набралось такое:
Код
procedure Proc1;
begin
end;

function Proc1Len : Cardinal;
begin
  Result := Cardinal(@Proc1Len);
  Dec (Result, Cardinal(@Proc1));
end;

Вылезает Internal Error. Смысл тот же самый, но не компилируется.
Уж извини меня, МРак, такого тупого программера, ведь только сел за Дельфи, а нигде не написано, как реализовать нужную мне задачу. Может ты мне скажешь, как же узнать размер процедуры, раз ты такой знаток Дельфей, компиляторов и асмов - это ведь тебе раз плюнуть, а мне придется мараться, глюки случайно находить то тут, то там, и я же буду, самое главное, виноват в этих глюках...

Короче, из-за неточности решил попробовать сделать через одно место. По смыслу метка - это адрес. Вот я и сделал так:
Код
label LabelEndOfProc;

procedure Proc1;
begin
// код здесь
  LabelEndOfProc:
end;

function Proc1Len : cardinal;
begin
  Result := Cardinal(@LabelEndOfProc) - Cardinal(@Proc1);
//  Result := Cardinal(LabelEndOfProc) - Cardinal(@Proc1); // тоже не работает
end;

Но так нельзя... Вот если бы ввели бы возможность узнавания адреса метки...
Ради эксперимента решил посмотреть, что будет, если:
Код
function Proc1Len : cardinal;
asm
  lea eax, [LabelEndOfProc - offset Proc1]
end;

Вот тут дельфи гнется, и окно редактора кода в дельфи становится глухим на нажатие кнопок.
Извиняюсь, МРак, конечно, за абсурдность идеи, видимо не дано быть мне программером, DVA мне это говорил, теперь ты говоришь...
Все, теперь буду трактористом. smile

В итоге я сделал вычисление размера процедуры по-трактористски:
Код

const
  SuperID = $12345678;
procedure Proc1; assembler;
asm
  la-la-la
  ret
  dd SuperID
end;

function Proc1Len : cardinal;
begin
  Result := Cardinal(@Proc1Len);
  while PCardinal(Result)^ <> SuperID do Dec(Result);
  Result := Result - Cardinal(@Proc1Len);
end;

Но опять же, так как это сделано по-трактористски, то не компилится (internal error)...
Найди разницу, МРак, и скажи, в чем принципиальное отличие, этот вариант компилится и работает:
Код
function Proc1Len : cardinal;
var a : Cardinal;
begin
  Result := Cardinal(@Proc1Len);
  while PCardinal(Result)^ <> SuperID do Dec(Result);
  a := Cardinal(@Proc1Len);
  Result := Result - a;
end;


Цитата
Оптимизатор как раз к ассемблерным вставкам довольно хреного
относится. Причем в любом языке.

И к чему ты это сказал ? Не использовать асм ? Спасибо! Или не использовать дельфи, а чисто асм ? Тоже спасибо!

А теперь, на десерт smile разбор такого вот изречения:
Цитата
Я понимаю что случайная описка валящая компилятор ни есть гуд. Но чтот в исходном сообщении я случайной описки не видел. Там было только агрессивное использования ассемблера с наглыми передачами управления и разрушением стека и наглое приведение типов с попыткой декрементировать полученное значение. Если второе с весьма большим натягом и можно назвать опиской то первое вообще ни в какие ворота не лезет.

Очень посмешил! smile
Цитата
с наглыми передачами управления

Хоть убей, но рыл-рыл, перерыл, но ниодной передачи управления так и не нашел!... А нет, что же я ? Ведь там есть такая процедура:
Procedure Proc1: nop ret
Возврат из процедуры - это передача управления! Притом наглая! Ведь до ret'а нет никаких осмысленных действий! Что это за процедура, которая ничего не делает? smile Хотя я наверное не говорил, что я УРЕЗАЛ код!
Цитата
разрушением стека

Ты можешь себе представить такое, что там в последствии была инструкция POP! Или ты забыл про такую команду, как POP, или я не написал, что код урезан ?
Цитата
наглое приведение типов

Какой же я наглец! Привести pointer к cardinal - это не по-программерски! Это нагло, по-ламерски, и вообще ерунда какая-то!
Цитата
с попыткой декрементировать полученное значение

Dec от слова Decrement, ты абсолютно прав. Но ты забыл сказать, что это НАГЛАЯ попытка декремента! smile А в дельфи можно декрементировать/инкрементировать целочисленные переменные, в данном случае - cardinal. Cardinal - это 4 байта, в байте 8 бит, бит - это 0 или 1... К чему это все ? smile

Короче, МРак, спасибо, что объяснил построчно, что же я там накалякал.

Цитата
Не имеет. Шансы имеет програмер. Но видимо такого никто не ожидал - видать не заложились

Да... Куда уж мне, бесталантному трактористу-програмисту-самоучке тягаться с таким титаном программирования, как МРак, который своим зорким взором смотря вдаль (правда не слыша, что ему кричат в упор) сразу выцепил из толпы "ламака" (т.е. меня).

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

По-моему, вывод один - тут есть только один индивид (МРак), который строит из себя супер-программера, которому влом объяснять азы тупым программерам (таким же тупым как и Борландовцы?), типа меня (p0s0l).

Про тупость Борланда - это твои слова. Я без всякого злого умысла выложил то, что накопал (найди хоть слово в адрес дельфи или Борланда), никак не думая, что найдется умник МРак, и начнет говорить, что код абсурдный, противоречит всем законам физики и т.д. Но тема-то создана для сбора глюков. Но никак не для спора на темы о правильности писания кода. Неважно, правильно я сделал, или нет, написав ту лажу-нелажу, но главное, что Дельфи от этого не защищен.

Особенно интересуют Internal Error-ы. Например, помню был случай, когда прогал то ли на D5, то ли на D6. И там писал процедурину, где было два вложенных цикла, в циклах - пара вложенных условий, пара case'ов, короче, такая вложенность begin..end'ов. Вставил break, да не туда, получилось вне цикла. При компиляции выдавалось что-то вроде Internal Error, но курсор на строку с break'ом не ставился.
Потерял полчаса прежде чем догадался, что дело было в Break. (Умный МРак скажет - тупой программер, вот так долго и искал...). Вот, теперь (В D7) эта ошибка уже проименована, и догадаться в чем дело не составляет труда...
И поэтому, МРак, не вижу ничего плохого в том, чтобы говорить об ошибках в Delphi, может, это кому-то поможет, и может, это кому-то интересно.

Короче, МРак, жду твоего ответа! Уж очень с тобой интересно общаться, настроение умеешь поднимать! smile


--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 9.1.2004, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Уфф, не думал что столько выйдет! Долго не бывал на форуме - сказывается...



--------------------
С уважением, г-н Посол.
PM   Вверх
Полудненко Олег
Дата 9.1.2004, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Українець
**


Профиль
Группа: Участник...
Сообщений: 556
Регистрация: 13.8.2003

Репутация: 1
Всего: -11



ещё если после какого-нить опреатора стоит end, то после этого самого оператора можно не ставить ; и всё работает ОК:
Код

begin
showmessage('gluk')
end;

PM MAIL   Вверх
Fedor
Дата 10.1.2004, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



Полудненко Олег Не понял... Ты думаешь, что это - глюк дельфи? На самом деле, это - не глюк, а наоборот возможность. Наоборот считается, что ";" - это отдельный оператор, и если его поставить перед end, то скорость работы программы уменьшится. Ненамного правда.


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Петрович
Дата 10.1.2004, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



По поводу ; перед end.
Дело в том, что язык Pascal лежащий в основе Delphi относится к языкам в которых символ ; является разделителем операторов. А поскольку end не является оператором, то и ; ставить перед ним нет надобности. А еще, в Pascal'е есть понятие пустой оператор, поэтому, можно ставить подряд несколько ;, ну и конечно ставить ; перед end. Причем замечу, наличие символов ; перед end, а так-же их количество на скорость работы программы не влияет. Достаточно взлянуть на код генерируемый компилятором.
А для справки, есть языки в которых символ ; служит символом завершающим оператор. В таких языках пропуск ; недопустим.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Fedor
Дата 11.1.2004, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



Петрович Согласен. Я ошибался.


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
dm9
Дата 11.1.2004, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Насчёт ";":
был у меня как-то такой глюк в 5-х, то ли 6-х Делфях...
Стоял у меня перед end'ом оператор, после него точки с запятой не было. Программа не работала. После часа экспериментов до меня наконец дошло, что этот последний оператор компилятор не видит! Поставил точку с запятой - всё заработало. Теперь всегда ставлю ";" перед "end"...
PM MAIL ICQ   Вверх
Полудненко Олег
Дата 13.1.2004, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Українець
**


Профиль
Группа: Участник...
Сообщений: 556
Регистрация: 13.8.2003

Репутация: 1
Всего: -11



Ещё можно создавать переменные следующего вида integer:string; Тоесть давать имена переменным типа iteger, write и т.д.
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0679 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.