Про КОПИ: в КомПасе его нет, зато есть селектор $ (для справки: если VAR arr: ARRAY N OF CHAR, то arr обозначает массив, а arr$ - строку, содержащуюся в этом массиве; поэтому str := arr$ означает строковое копирование).
Дано:
Код:
MODULE Files;
TYPE Name = ARRAY 256 OF CHAR;
PROCEDURE (dir: Directory) Old* (loc: Locator; name: Name; shared: BOOLEAN)
END Files.
И вот взгляните, делаем команду для пользовательского интерфейса:
Код:
PROCEDURE Cmd* (IN fname: ARRAY OF CHAR);
BEGIN ...
f := Files.dir.Old(loc, fname$, Files.shared)
END
Без строкового селектора $ компилятор не пропустит: ARRAY OF CHAR и Name = ARRAY N OF CHAR несовместимы. Не вопрос, поставим доллар. И легко уроним команду, передав ей 257-литерную строку. Кмк, таких удобных долларов распихано немало по ББ, и в эксплуатации, да еще если злоумышленник постарается, они обязательно взорвутся.
Что это означает? Для меня:
1) внимательность с каждым $, а также строковым +: средства мощчные, удобные, и потенциально опасные
2) Если я принимаю параметр-открытый массив, то Я отвечаю за то, чтобы заранее проверить длину строки в нем, и что она влезает туда, куда я ее захочу присвоить
3) Если я не хочу возиться с проверками вместимости, то я приму параметр-фиксированный массив. Или если это бессмысленно: например, как будет Files сообщать о недопустимой длине имени? кому? куда? Таким образом, объявляя параметр-фиксмассив, я отказываюсь отвечать за вместимость, полагаюсь на гарантии языка (макс длина фиксирована). Вдумчивый программист-клиент, читая мой интерфейс и видя в нем параметр-фиксмассив, поймет, что я передал ему ответственность за вместимость. Если он уверен, что все ок, или если авост допустим, то может ставить $.
(Для справки: $ проверяет вместимость, даже когда отключена проверка ОДЗ базовых типов. Вероятно, если отключить компиляцию ASSERTов, $ перестанет проверять; но это не точно)