Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Безопасность работы с pchar в Pascal

Delphi , Компоненты и Классы , Процедуры и функции

В статье рассматривается проблема безопасности работы с pchar в Pascal, в частности, при использовании функции GetDirs из пакета SysUtils. Функция GetDirs не является memory-safe, так как перезаписывает значения переменных, расположенных после массива pchar, передаваемого в качестве параметра. Это может привести к неопределенному поведению программы и утечкам памяти.

Для решения этой проблемы предлагается несколько вариантов:

  1. Убедиться, что массив pchar, передаваемый в функцию GetDirs, имеет достаточный размер. Это можно сделать, используя функцию SetLength, как показано в примере кода, предоставленном пользователем Bart:
procedure TestGetDirs(var Path: string);
var
  DirNodes: array of PChar;
  Res: LongInt;
  i: Integer;
begin
  SetLength(DirNodes, Length(Path)); //the function cannot return more nodes then the length of the string, so this is definitely safe
  Res := GetDirs(Path, DirNodes);
  if Res <> -1 then
    SetLength(DirNodes,Res)
  else
    DirNodes := nil;
  writeln('GetDirs(Path, DirNodes) = ',Res);
  for i := Low(DirNodes) to High(DirNodes) do
    writeln(i,': ',DirNodes[i]);
end;
  1. Добавить проверку границ массива в саму функцию GetDirs, как предложил пользователь bytebites:
Function GetDirs (Var DirName : string; Var Dirs : Array of PChar) : Longint; {$ifdef FPC_HAS_CPSTRING}rtlproc;{$endif}
 Var I, hd : Longint;
 begin
  I:=1;
  Result:=-1;
  hd:=high(Dirs);
  While (I<=Length(DirName)) and (result<hd) do
  1. Использовать альтернативную функцию для разделения строки на компоненты пути, например, TString.Split, как предложил пользователь dbannon:
procedure TestSplit(var Path : string);
var
        i : integer;
        AnArray : TStringArray;
begin
    AnArray := Path.split(PathDelim, TStringSplitOptions.ExcludeEmpty);
        for i := 0 to high(AnArray) do
                writeln(AnArray[i]);
end;

Важно отметить, что функция TString.Split учитывает все возможные разделители пути, а не только PathDelim, как функция GetDirs. Поэтому, при использовании TString.Split нет необходимости беспокоиться о том, какой разделитель пути будет использоваться в конкретной операционной системе.

В заключение, следует отметить, что при работе с pchar в Pascal важно соблюдать осторожность, чтобы избежать утечек памяти и неопределенного поведения программы. Использование альтернативных функций для разделения строки на компоненты пути, таких как TString.Split, может быть более безопасным и удобным, чем использование функции GetDirs.

Создано по материалам из источника по ссылке.

Статья рассматривает проблему безопасности работы с pchar в Pascal, в частности, при использовании функции GetDirs из пакета SysUtils, и предлагает несколько вариантов её решения.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Процедуры и функции ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 02:00:44/0.0031769275665283/0