{ ===========================================================================
  ОДНА ЗАДАЧА НА ЧЕТЫРЁХ ЯЗЫКАХ — 2/4: Object Pascal (Delphi / Free Pascal)
  Задача: скопировать строку в буфер размером ровно 16 символов.

  Компиляция (если установлен Free Pascal):   fpc CopyName.pas
  Онлайн, без установки:                      onlinegdb.com, язык Pascal
  =========================================================================== }

program CopyName;

{$MODE OBJFPC}
{$H+}

{ ---------------------------------------------------------------------------
  ВОТ ЭТА СТРОКА — САМОЕ ВАЖНОЕ В ФАЙЛЕ.

  {$RANGECHECKS ON}  — компилятор вставляет проверку границ при каждом
                       обращении к элементу массива.
  {$RANGECHECKS OFF} — проверок нет, поведение как в ассемблере.

  То есть в Object Pascal безопасность памяти — это НАСТРОЙКА СБОРКИ.
  Её можно включить, а можно случайно отключить ради быстродействия.
  Поэтому в РБПО проверяется не только исходный код, но и параметры
  компиляции: процесс 5.12 «Использование безопасной системы сборки»
  ГОСТ Р 56939-2024. Флаги компилятора — такой же объект контроля,
  как и сам текст программы.
  --------------------------------------------------------------------------- }
{$RANGECHECKS ON}

type
  TBuffer = array[0..15] of Char;   { буфер: ровно 16 символов }

var
  Buffer: TBuffer;
  Source: string;
  I: Integer;

begin
  Source := 'Иванова Анна Петровна, отдел информационной безопасности';

  WriteLn('Длина исходной строки: ', Length(Source));
  WriteLn('Размер буфера:         ', SizeOf(Buffer) div SizeOf(Char));
  WriteLn;

  { Цикл идёт по длине ИСТОЧНИКА, а не по размеру ПРИЁМНИКА.
    Это та же логическая ошибка, что и в ассемблерном файле. }
  for I := 1 to Length(Source) do
    Buffer[I - 1] := Source[I];

  WriteLn('До сюда выполнение не дойдёт: ', Buffer[0]);
end.

{ ===========================================================================
  ЧТО ПРОИЗОЙДЁТ ПРИ ЗАПУСКЕ

  При {$RANGECHECKS ON} программа аварийно завершится на 17-м символе:
      Runtime error 201 (Range check error)

  При {$RANGECHECKS OFF} она молча продолжит писать за границу буфера —
  ровно как ассемблерный вариант.

  РАЗНИЦА С АССЕМБЛЕРОМ: ошибка обнаружена и программа остановлена.
  Отказ в обслуживании — это плохо, но несравнимо лучше, чем тихое
  повреждение соседней памяти, которым можно управлять извне.

  Правило, которое стоит запомнить:
  «упасть громко» безопаснее, чем «продолжить работу в неизвестном состоянии».
  =========================================================================== }
