powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / pointer returned in FREE_IT function was not allocated by ib_util_malloc
8 сообщений из 8, страница 1 из 1
pointer returned in FREE_IT function was not allocated by ib_util_malloc
    #40057281
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тыкните носом, что я делаю не так.

В одной UDF экспортируются две функции
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
DECLARE EXTERNAL FUNCTION GF_INC_DDEGREE
    SMALLINT,
    SMALLINT
RETURNS SMALLINT FREE_IT
ENTRY_POINT 'IncDDegree' MODULE_NAME 'GeoFunc.dll';

DECLARE EXTERNAL FUNCTION GF_INFO
RETURNS CSTRING(512) FREE_IT
ENTRY_POINT 'GetUDFInfo' MODULE_NAME 'GeoFunc.dll';

Функции реализованы так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
function IncDDegree(ADeg, AInc: PSmallInt): PSmallInt; cdecl;
begin
  Result := IB_Util_Malloc(SizeOf(Result^));
  try
    Result^ := UGeoFunc.IncDDegree(ADeg^, AInc^);
  except
    Result^ := ADeg^;
  end;
end;

function StrToIBPChar(const AStr: AnsiString): PAnsiChar;
begin
  Result := IB_Util_Malloc(Length(AStr) + 1);
  System.AnsiStrings.StrPCopy(Result, AStr);
end;

function GetUDFInfo: PAnsiChar; cdecl;
begin
  try
    Result := StrToIBPChar(AnsiString(TModuleInfo.Create.ToString));
  except
    on E: Exception do
      Result := ExceptToIBPChar(E);
  end;
end;

Вызов GF_INFO нормально отрабатывается. Вызов GF_INC_DDEGREE выбрасывает исключениеUnsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
Bad written UDF detected: pointer returned in FREE_IT function was not allocated by ib_util_malloc.
UDF: GF_INC_DDEGREE.
Смотрю ProcessExplorer. В процесс загружена ib_util.dll из папки c:\Program Files\Firebird\Firebird_3_0\ версии 3.0.7.33374

В чем разница? В этой UDF еще много функций и работает только GF_INFO. В соседних UDF, которые написаны по тому же принципу, работают все функции

С уважением, Vasilisk
...
Рейтинг: 0 / 0
pointer returned in FREE_IT function was not allocated by ib_util_malloc
    #40057286
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

free_it для возвращаемого Smallint - это МОЩНО. Не надо так. free_it в основном для cstring.
Теоретически и smallint можно, но не нужно, ибо указатель больше чем сама переменная, и т.д.

Кроме того, самый ужас вот тут
Result^ := ADeg^;

Нельзя так. в случае ошибки так и получается, что результату дан указатель, который не был аллокирован через IB_Util_Malloc.
Это входной параметр. И вообще он передается как var, а не как psmallint.
(понятно что это в обоих случаях ссылки, но для понимания лучше писать var a smallint, а не a psmallint).

лучше почитать
http://www.ibase.ru/udf_ok

короче, возвращай smallint by value, и не выпендривайся :-)
...
Рейтинг: 0 / 0
pointer returned in FREE_IT function was not allocated by ib_util_malloc
    #40057287
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

на всякий случай я еще дам ссылку на свою safeudf, в которой даны 3 примера.
Возврат входного параметра, возврат через free_it, и возврат через входной параметр.
Аллокирование через ib_util делается только для free_it, и смешивать возврат и через свою память и через входные переменные нельзя.
http://www.ibase.ru/files/download/safeudf.zip
...
Рейтинг: 0 / 0
pointer returned in FREE_IT function was not allocated by ib_util_malloc
    #40057290
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
результату дан указатель, который не был аллокирован через IB_Util_Malloc.
Можно. Я в указатель, который аллокирован через IB_Util_Malloc записываю значение по указателю ADeg.
_Vasilisk_
Код: pascal
1.
 Result^ := ADeg^;

Никакого криминала.
Это не
Код: pascal
1.
Result := ADeg;


kdv
короче, возвращай smallint by value, и не выпендривайся :-)
Этой UDF уже лет 20 как. Она писалась еще для IB 6.0

Новые функции уже идут By Value
...
Рейтинг: 0 / 0
pointer returned in FREE_IT function was not allocated by ib_util_malloc
    #40057292
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
смешивать возврат и через свою память и через входные переменные нельзя.
Я не смешиваю
...
Рейтинг: 0 / 0
pointer returned in FREE_IT function was not allocated by ib_util_malloc
    #40057295
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот еще функция
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
DECLARE EXTERNAL FUNCTION GF_POINT_IN_CIRCLE
    DOUBLE PRECISION,
    DOUBLE PRECISION,
    DOUBLE PRECISION,
    DOUBLE PRECISION,
    DOUBLE PRECISION
RETURNS SMALLINT FREE_IT
ENTRY_POINT 'PointInCircle' MODULE_NAME 'GeoFunc.dll';

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function PointInCircle(ACenterH, ACenterL, APntH, APntL, ARadius: PDouble): PSmallInt;
var
  LCenter: TGeoPoint;
  LPoint: TGeoPoint;
begin
  Result := IB_Util_Malloc(SizeOf(Result^));
  try
    LCenter := GeoPoint(ACenterH^, ACenterL^);
    LPoint := GeoPoint(APntH^, APntL^);
    Result^ := SmallInt(UrsGeoFunc.PointInCircle(LPoint, LCenter, ARadius^));
  except
    Result^ := CFUNCION_ERROR;
  end;
end;

Ошибка та же
...
Рейтинг: 0 / 0
pointer returned in FREE_IT function was not allocated by ib_util_malloc
    #40057818
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function IncDDegree(ADeg, AInc: PSmallInt): PSmallInt; cdecl;
begin
  Result := IB_Util_Malloc(SizeOf(Result^));
  try
    Result^ := UGeoFunc.IncDDegree(ADeg^, AInc^);
  except
    Result^ := ADeg^;
  end;
end;

Кто балбес? Я балбес. В двух модулях объявлены функции с идентичными именами. В итоге были проэкспортированы функции из другого модуля
...
Рейтинг: 0 / 0
pointer returned in FREE_IT function was not allocated by ib_util_malloc
    #40057823
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

да, чего-то я перебдел.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / pointer returned in FREE_IT function was not allocated by ib_util_malloc
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]