Вверх ↑
Ответов: 4621
Рейтинг: 746
#1: 2018-10-30 15:08:06 ЛС | профиль | цитата
Раз уж затронули тему кодогенератора FTCG - поделюсь своими наблюдениями.

В файле FTCG_CodeGen.dpr есть объект типа TScData и указатель на него PScData.
Объекты в Delphi создаются либо по указателю с помощью оператора New(), либо прямо объявляя переменную этого типа. В обеих случаях память, выделенная под объект, не инициализируется 0-ми. Автор кода об этом знает, например, в этом месте, когда после New(Result) выполняет FillChar(Result^, sizeof(TScData), 0):
function MakeData(num:integer):PScData; overload;
begin
New(Result);
FillChar(Result^, sizeof(TScData), 0);
Result.SetValue(num);
end;
Но автор упустил обнуление памяти в других местах, как это:
function map_lower(parser:TParser; args:TArgs):TScData;
begin
Result.SetValue(LowerCase(args.Values[0].toStr()), args.Values[0].GetType);
end;
Переменная Result не заполняется 0-ми, потому что локальные переменные и результат функции автоматически не инициализируются. В результате этого метод полученного таким образом объекта, например
procedure TScData.Clear;
begin
if ldata <> nil then
dispose(ldata);
end;
может выдавать ошибку, потому что поле TScData.ldata <> nil (память созданного объекта изначально не была обнулена), но указывает оно в никуда, а следующий dispose(ldata) будет пробовать уничтожить непонятно что.
На данный момент оно работает - просто по чистой случайности компилятор Delphi 4 с текущими настройками размещает созданные таким образом объекты в обнуленных участках памяти. Но нет никакой гарантии, что после каких-либо незначительных изменений в каких-либо случаях на месте объекта не окажутся какие-либо числа.
Надо бы это как-то поправить или хотя бы принять к сведению.
карма: 26

0
Редактировалось 1 раз(а), последний 2018-10-30 15:24:27