• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Delphi 7 И Сборка Проекта -- Каждый Раз По Новому?

  • Автор темы erhe
  • Дата начала
E

erhe

Здравствуйте.

Вопрос, видимо, чисто академический, но мне немного неприятно ;)

Имеется консольное приложение написанное на Дельфи 7. Оно обрабатывает входные данные и, если всё хорошо, формирует выходной файл. Или записывает ошибки, чтобы пользователь мог их обработать и повторить обработку.

Данные прогоняются через множество проверок. Для пары проверок был написан такой код (упрощаю, оставляю только нужное):

Код:
function Fun1(const AList: TStringList): Boolean;
var
dd: TDateTime;
i: Integer;
begin
dd := TMyClass(AList.Objects[0]).DateR;
. . .
end;

function Fun2(const AList: TStringList): Boolean;
var
dd: TDateTime;
i: Integer;
begin
dd := TMyClass(AList.Objects[0]).DateDr;
. . .
end;
Эти функции вызываются последовательно и только тогда, когда в списке есть данные. Т.е., всегда AList.Count >= 1.

К чему пост. Через пару месяцев потребовалось поменять зашитую в приложение константу -- так сделано специально, чтобы ушлые пользователи не могли жульничать. Поменял значение константы, нажал "Save", потом "Build". И получил при работе ошибку в Fun1():
при первом присваивании -- выход индекса на границы массива.

Запустил в отладчике: да, в списке есть 1 значение; да, TMyClass().DateR -- возвращает в отладчик значение, но присваивания не происходит. Причем! Если закомментировать вызов Fun1() и сразу пойти в Fun2() -- всё работает на тех же данных!

Ладно, посколько время не ждет, сделал изврат и обошел случай 1 элемента через if. Через пару месяцев снова поменял значение константы и, поскольку время было, вернул код к первоначальному без извращенного if -- всё работает.

А потом было ещё веселее. Поменяли значение константы -- не работает. Вернули на то, что было -- не работает. Снова поставили нужное значение и после 4-5 нажатия на build -- заработало.

Такое ощущение, что Дельфи 7 на одних и тех же исходниках собирает разные exe-шки! Бред просто какой-то...

Кто стаким сталкивался или знает как лечить? Грустно наступать на грабли в отлаженном коде...
 
N

nforumer

Могу лишь сказать, что глюки есть в любых программах. Особенно в тех, которые пишем мы сами))) С подобными вещами сталкивался, но объяснения так и не нашёл. Иногда в таких случаях помогает перезагрузка Delphi (или другой среды разработки, так как глючит не только Delphi)))
 
V

Vadik(R)

Здравствуйте.

Вопрос, видимо, чисто академический, но мне немного неприятно ^_^

Имеется консольное приложение написанное на Дельфи 7. Оно обрабатывает входные данные и, если всё хорошо, формирует выходной файл. Или записывает ошибки, чтобы пользователь мог их обработать и повторить обработку.

Данные прогоняются через множество проверок. Для пары проверок был написан такой код (упрощаю, оставляю только нужное):

Код:
function Fun1(const AList: TStringList): Boolean;
var
dd: TDateTime;
i: Integer;
begin
dd := TMyClass(AList.Objects[0]).DateR;
. . .
end;

function Fun2(const AList: TStringList): Boolean;
var
dd: TDateTime;
i: Integer;
begin
dd := TMyClass(AList.Objects[0]).DateDr;
. . .
end;
Эти функции вызываются последовательно и только тогда, когда в списке есть данные. Т.е., всегда AList.Count >= 1.

К чему пост. Через пару месяцев потребовалось поменять зашитую в приложение константу -- так сделано специально, чтобы ушлые пользователи не могли жульничать. Поменял значение константы, нажал "Save", потом "Build". И получил при работе ошибку в Fun1():
при первом присваивании -- выход индекса на границы массива.

Запустил в отладчике: да, в списке есть 1 значение; да, TMyClass().DateR -- возвращает в отладчик значение, но присваивания не происходит. Причем! Если закомментировать вызов Fun1() и сразу пойти в Fun2() -- всё работает на тех же данных!

Ладно, посколько время не ждет, сделал изврат и обошел случай 1 элемента через if. Через пару месяцев снова поменял значение константы и, поскольку время было, вернул код к первоначальному без извращенного if -- всё работает.

А потом было ещё веселее. Поменяли значение константы -- не работает. Вернули на то, что было -- не работает. Снова поставили нужное значение и после 4-5 нажатия на build -- заработало.

Такое ощущение, что Дельфи 7 на одних и тех же исходниках собирает разные exe-шки! Бред просто какой-то...

Кто стаким сталкивался или знает как лечить? Грустно наступать на грабли в отлаженном коде...
Если один и тот же код скопилировать два раза подряд, то exeшки уже побайтово будут отличаться. Сам с твоей проблемой не сталкивался. Но если код модульный, попробую удалить файлы *.dcu, может он их как закешировал и не думает перестраивать? (Просто предположение)
 
Мы в соцсетях:

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