Аппаратные средства защиты информационных систем: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
м автоматическая отмена правки участника 95.78.124.194 (0.917/0.077)
Метка: откат
 
(не показаны 43 промежуточные версии 15 участников)
Строка 1: Строка 1:
<noinclude>{{к удалению|2022-05-04}}</noinclude>
{{rq|style|wikify|sources|refless|image|cat}}
'''Аппаратные средства защиты информационных систем''' — средства защиты информации и информационных систем, реализованных на аппаратном уровне. Данные средства являются необходимой частью [[Информационная безопасность|безопасности информационной системы]], хотя разработчики аппаратуры обычно оставляют решение проблемы информационной безопасности программистам.
статья в разработке


Эта проблема привлекла внимание многих фирм, в том числе и такой как [[Intel]]. В 80-х годах была разработана система 432. Но проект постигла неудача. Возможно, именно после неудачи "гранда" другие фирмы отказались от этой идеи.
В наши дни [[информационные системы]] внедрены во все сферы человеческой деятельности, и общество крайне зависимо от правильного их функционирования, от защищенности этих систем от ошибок программистов и от атак злоумышленников.
Казалось бы, концептуальная модель современных языков программирования представляет собой достаточную основу для создания защищенных информационных систем. Но, строго говоря, подобные идеи должны быть применены и к аппаратуре, иначе структуры, реализованные в коде, будут фиктивными. Подобная картина типична, разработчики аппаратуры обычно оставляют решение проблемы информационной безопасности программистам. Такие системы не могут удовлетворять понятию [[Информационная безопасность#Сущность понятия «информационная безопасность»|защищенных]].


Задача аппаратной защиты вычислений была решена советскими разработчиками созданием вычислительного комплекса [[Эльбрус (компьютер)|Эльбрус 1]]. В основе лежит идея контроля типов на всех уровнях системы, в том числе и на аппаратном. И основная заслуга разработчиков в планомерной её реализации.
Эта проблема привлекла внимание многих фирм, в том числе и такой как [[Intel]], признанного лидера в сфере производства микропроцессоров. В 80-х годах была разработана система 432. Но проект вследствие некоторых промахов постигла неудача. Возможно, именно безуспешность попытки одного из “грандов” создать защищенную систему, стала причиной, по которой многие другие фирмы отказались от этой идеи. Другой фактор до недавнего времени препятствовавший созданию защищенной системы – увеличение сложности оборудования.


== Общая модель защищенной системы ==
Эта проблема была параллельно решена советскими разработчиками именно создан вычислительный комплекс Эльбрус 1. В основе защиты вычислений лежала достаточно простая идея - контроль типов на всех уровнях системы, в том числе и на аппаратном. И главная заслуга разработчиков в планомерной ее реализации.
Разработчиками [[Эльбрус (компьютер)|Эльбруса]] была предложена следующая модель защищённой информационной системы
=Общая модель защищенной системы=
<ref>{{Cite web |url=http://www.mcst.ru/SECURE_INFORMATION_SYSTEM_V5_2r.pdf |title=Защищенное исполнение программ на базе аппаратной и системной поддержки архитектуры «Эльбрус»<!-- Заголовок добавлен ботом --> |access-date=2010-12-19 |archive-date=2006-10-15 |archive-url=https://web.archive.org/web/20061015071644/http://www.mcst.ru/SECURE_INFORMATION_SYSTEM_V5_2r.pdf |deadlink=no }}</ref>.
Рассмотрим модель информационной системы без применения конкретной реализации. В общем случае ее можно представить, как [[информационное пространство]] и обслуживающее его обрабатывающее устройство. В такой системе вычисления разбиваются на отдельные вычислительные модули, расположенные в информационном пространстве. Схему реализации вычислений можно представить следующим образом: обрабатывающее устройство под руководством программы может обращаться к этому пространству, читая и редактируя его.


Информационную систему в общем случае можно представить, как [[информационное пространство]] и обслуживающее его обрабатывающее устройство. Вычисления разбиваются на отдельные вычислительные модули, расположенные в информационном пространстве. Схему реализации вычислений можно представить следующим образом: обрабатывающее устройство под руководством программы может обращаться к этому пространству, читая и редактируя его.
Для описания системы введем понятия
*узел
*ссылка
*контекст программы


Для описания системы введем понятия
'''Узел''' - ячейка данных произвольного объема вместе со [[Ссылка (программирование)|cсылкой]] на нее из обрабатывающего устройства.
* узел
* ссылка
* контекст программы


'''Узел''' — ячейка данных произвольного объема вместе со [[Ссылка (программирование)|ссылкой]] на неё из обрабатывающего устройства.
'''Cсылка''' не только описывает данные, но и содержит всю права доступа к ним. Система должна обеспечивать контроль над тем, чтобы в операциях, использующих ссылки, не были использованы данные других типов а в операциях с аргументами других типов ссылка не могла быть модифицирована.


'''Ссылка''' не только описывает данные, но и содержит все права доступа к ним. Система должна обеспечивать контроль над тем, чтобы в операциях, использующих ссылки, не были использованы данные других типов а в операциях с аргументами других типов ссылка не могла быть модифицирована.
'''Контекст программы''' - это множество всех данных доступных для вычислений в конкретном модуле.


'''Контекст программы''' — множество всех данных доступных для вычислений в конкретном модуле.
==Базовая функциональность модели защищенной информационной системы==

=== Базовая функциональность модели защищенной информационной системы ===


'''Создание узла''' произвольного объема для хранения данных
'''Создание узла''' произвольного объема для хранения данных


После появления новый узел должен быть
После появления новый узел должен быть
*пуст
* пуст
*доступен только данному обрабатывающему устройству и только через данную ссылку
* доступен только данному обрабатывающему устройству и только через данную ссылку



'''Удаление узла'''.
'''Удаление узла'''.
*попытка использования ссылок на удаленные узлы должна приводить к системным прерываниям
* попытка использования ссылок на удаленные узлы должна приводить к системным прерываниям


'''Смена контекста''' или смена процедуры, исполняемой обрабатывающим устройством.

'''Cмена контекста''' или смена процедуры исполняемой обрабатывающим устройством.


Новый контекст состоит из трех частей:
Новый контекст состоит из трех частей:
*глобальные переменные, переданные по ссылке из старого контекста
* глобальные переменные, переданные по ссылке из старого контекста
*часть, переданная копированием значения(параметры)
* часть, переданная копированием значения (параметры)
*локальные данные, созданные в новом модуле
* локальные данные, созданные в новом модуле


Общие методы и требования к переключению контекста:
Общие методы и требования к переключению контекста:
*Идентификация нового контекста(например, особая ссылка на него, позволяющая лишь переключаться между контекстами)
* Идентификация нового контекста (например, особая ссылка на него, позволяющая лишь переключаться между контекстами)
*Непосредственно переключение контекста(исполнение старого кода после переключения контекста запрещено, исходя из [[Информационная безопасность#Существенные признаки понятия|принципов защищенности]])
* Непосредственно переключение контекста (исполнение старого кода после переключения контекста запрещено, исходя из [[Информационная безопасность#Существенные признаки понятия|принципов защищенности]])
*Операции формирования ссылки или другой структуры для идентификации и переключения контекста
* Операции формирования ссылки или другой структуры для идентификации и переключения контекста


Реализации могут быть разными(в том числе и без особых ссылок), но должны быть выдержаны основные принципы:
Реализации могут быть разными (в том числе и без особых ссылок), но должны быть выдержаны основные принципы:
*точки входа в контекст формируются внутри самого этого контекст
* точки входа в контекст формируются внутри самого этого контекст
*эта информация делается доступной другим контекстам
* эта информация делается доступной другим контекстам
*код и контекст переключаются одновременно
* код и контекст переключаются одновременно


==Анализ модели==
=== Анализ модели ===
1.Защищенность системы базируется на следующих принципах:
# Защищенность системы базируется на следующих принципах:
*доступ к узлу имеет только модуль, создавший его, если только он добровольно не передаст ссылку кому-либо еще
#* доступ к узлу имеет только модуль, создавший его, если только он добровольно не передаст ссылку кому-либо еще
*множество данных, доступных модулю, в любой момент времени строго контролируется контекстом
#* множество данных, доступных модулю, в любой момент времени строго контролируется контекстом
# Результирующая защита предельно строгая, но она не ограничивает возможности программиста. Различные не пересекающиеся модули могут работать в одной программе, вызывая друг друга и обмениваясь данными. Для этого достаточно, чтобы каждый из них содержал особую ссылку для переключения контекста на другой.
# Построенная система значительно упрощает поиск и исправление ошибок благодаря строгому контролю типов. Например, попытка изменить ссылку сразу приведет к аппаратному прерыванию в месте ошибки. После чего её легко можно отследить и исправить.
# Обеспечивается модульность программирования. Неправильная работа программы никак не повлияет на другие. «Испорченный» модуль может лишь выдать неверные результаты.
# Для использования системы от программиста не требуется дополнительных усилий. Кроме того, при написании программы под такую модель уже нет необходимости дополнительно оговаривать права доступа, способы их передачи и т. д.


== Архитектура Эльбрус ==
2.Результирующая защита предельно строгая, но она не ограничивает возможности программиста. Различные не пересекающиеся модули могут работать в одной программе, вызывая друг друга и обмениваясь данными. Для этого достаточно, чтобы каждый из них содержал особую ссылку для переключения контекста на другой.
В '''архитектуре Эльбрус''' для разграничения типов данных вместе с каждым словом в памяти хранится его [[тег]].

3.Построенная система значительно упрощает поиск и иcправление ошибок благодаря строгому контролю типов. Например, попытка изменить ссылку сразу приведет к аппаратному прерыванию в месте ошибки. После чего ее легко можно отследить и исправить.

4.Обеспечивается модульность программирования. Неправильная работа модуля никак не повлияет на другие. "Испорченный" модуль может лишь выдать неверные результаты.

5.Для использования системы от программиста не требуется дополнительных усилий. Кроме того, при написании программы нет необходимости дополнительно оговаривать права доступа, способы их передачи и т.д.

=Примеры реализации=
==Архитектура Эльбрус==
В '''архитектуре Эльбрус''' для разграничения типов данных вместе с каждым словом в памяти хранится его [[тег|тег]].
По тегу можно определить является ли данное слово ссылкой или принадлежит к какому-либо специальному типу данных.
По тегу можно определить является ли данное слово ссылкой или принадлежит к какому-либо специальному типу данных.

===Ссылки и работа с ними===
=== Ссылки и работа с ними ===
В ссылке содержится описание области(дескриптор) на которую она ссылается и права доступа. Дескриптор обязательно содержит содержит базовый адрес и размер данных.
В ссылке содержится описание области (дескриптор), на которую она ссылается и права доступа. Дескриптор обязательно содержит базовый адрес и размер данных.


Возможны следующие форматы дескриптора:
Возможны следующие форматы дескриптора:
*дескриптор объекта
* дескриптор объекта
*дескриптор массива
* дескриптор массива


Дескриптор объекта служит для поддержания объектно-ориентированного программирования и содержит дополнительно описание приватной и публичной областей. Обращение в публичную область стандартно(сложение базового адреса и индекса вместе с последующим контролем размера. Если в командах обращения в память стоит признак приватных данных, то для
Дескриптор объекта служит для поддержания объектно-ориентированного программирования и содержит дополнительно описание приватной и публичной областей. Обращение в публичную область стандартно(сложение базового адреса и индекса вместе с последующим контролем размера. Если в командах обращения в память стоит признак приватных данных, то для
разрешения обращения проверяется специальный регистр в процессоре, который хранит тип
разрешения обращения проверяется специальный регистр в процессоре, который хранит тип
объекта, когда работают программы обработки данного типа. Таким образом, внутри
объекта, когда работают программы обработки данного типа. Таким образом, внутри
программы становятся доступными приватные данные объектов
программы становятся доступными приватные данные объектов
этого типа.
этого типа.


При доступе к ячейке памяти проверяется корректность ссылки.
При доступе к ячейке памяти проверяется корректность ссылки.


Важные операции для работы со ссылками:
Важные операции для работы со ссылками:
*индексация(выработка ссылки на элемент массива)
* индексация(выработка ссылки на элемент массива)
*операция CAST для дескрипторов объекта(преобразование к базовому классу)
* операция CAST для дескрипторов объекта(преобразование к базовому классу)
*компактировка(уничтожает ссылки на удаленную память и плотно компактирует занятую память)
* компактировка(уничтожает ссылки на удаленную память и плотно компактирует занятую память)


===Контексты и и методы работы с ними===
=== Контексты и методы работы с ними ===
Контекст модуля состоит из данных хранящихся в оперативной памяти и в файлах, и подается в виде ссылки на регистры процессора.
Контекст модуля состоит из данных хранящихся в оперативной памяти и в файлах, и подается в виде ссылки на регистры процессора.


Переключение контекста - это, по сути, вызов процедуры или возврат из нее. При запуске процедуры полный контекст исходного модуля сохраняется, а нового - создается. При выходе из процедуры ее контекст уничтожается.
Переключение контекста — это, по сути, вызов процедуры или возврат из неё. При запуске процедуры полный контекст исходного модуля сохраняется, а нового — создается. При выходе из процедуры её контекст уничтожается.

===Реализация защищенного стека===
=== Реализация защищенного стека ===
При реализации процедурного механизма в Эльбрусе,для повышения эффективности выделения памяти для локальных данных используется
При реализации процедурного механизма в Эльбрусе, для повышения эффективности выделения памяти для локальных данных используется
механизм [[стек|стека]].
механизм [[стек]]а.
Стековские данные подразделяются на три группы по своим

Стековские данные подразделяются на три группы по своим
функциональным характеристикам и уровню доступности для пользователя:
функциональным характеристикам и уровню доступности для пользователя:
* параметры, локальные данные и промежуточные значения процедуры, размещенные в оперативных регистрах(стек процедур);
* параметры, локальные данные и промежуточные значения процедуры, размещенные в оперативных регистрах(стек процедур);
* параметры и локальные процедуры, размещенные в памяти(стек пользователя);
* параметры и локальные процедуры, размещенные в памяти(стек пользователя);
* "связующая информация", описывающая предыдущую (запустившую) процедуру в стеке процедур(стек связующей информации);
* «связующая информация», описывающая предыдущую (запустившую) процедуру в стеке процедур(стек связующей информации);
'''Стек процедур''' предназначен для данных, вынесенных на оперативные регистры. Каждая процедура
'''Стек процедур''' предназначен для данных, вынесенных на оперативные регистры. Каждая процедура
работает только в своем окне, которое может пересекаться с предыдущим окном
работает только в своем окне, которое может пересекаться с предыдущим окном
Строка 113: Строка 110:
(вызвавшей) процедуре и используемой при возврате. При защищенном
(вызвавшей) процедуре и используемой при возврате. При защищенном
программировании пользователь не должен иметь возможность изменять эту
программировании пользователь не должен иметь возможность изменять эту
информацию, поэтому для нее выделен специальный стек, доступный только
информацию, поэтому для неё выделен специальный стек, доступный только
операционной системе и аппаратуре. Стек связующей информации устроен так же,
операционной системе и аппаратуре. Стек связующей информации устроен так же,
как стек процедур.
как стек процедур.


Поскольку в стеке виртуальная память переиспользуется, встает проблема защиты
Поскольку в стеке виртуальная память переиспользуется, встает проблема защиты
данных. Она имеет два аспекта:
данных. Она имеет два аспекта:
*переиспользование памяти (выделение ранееосвобожденного пространства). В этой памяти могут, к примеру оказаться ссылки, недоступные модулю при правильной работе
* переиспользование памяти (выделение ранееосвобожденного пространства). В этой памяти могут, к примеру, оказаться ссылки, недоступные модулю при правильной работе
*"зависшие" указатели(ссылки старого владельца на переиспользуемую память)
* «зависшие» указатели(ссылки старого владельца на переиспользуемую память)


Первая проблема решается автоматической чисткой переиспользуемой памяти.
Первая проблема решается автоматической чисткой переиспользуемой памяти.
Строка 126: Строка 123:
процедуры можно сохранять только в текущем фрейме, либо передавать в качестве
процедуры можно сохранять только в текущем фрейме, либо передавать в качестве
параметра в вызываемую процедуру (передавать вверх по стеку). Соответственно,
параметра в вызываемую процедуру (передавать вверх по стеку). Соответственно,
указатель не может быть ни записан в глобальные данные, ни передан в качестве
указатель не может быть ни записан в глобальные данные, ни передан в качестве
возвращаемого значения, ни записан в глубину стека.
возвращаемого значения, ни записан в глубину стека.

== Примечания ==
{{примечания}}

== Ссылки ==
* [http://www.mcst.ru/SECURE_INFORMATION_SYSTEM_V5_2r.pdf Защищенные информационные системы. Б. А. Бабаян, 2003] (pdf)
* [https://web.archive.org/web/20110610221234/http://www.mcst.ru/2-3.htm Микропроцессор «Эльбрус»] на сайте МЦСТ
* [http://www.mcst.ru/e2k_arch.shtml Основные принципы архитектуры] (2001) на сайте МЦСТ


[[Категория:Информационная безопасность]]
[[Категория:Информационная безопасность]]

Текущая версия от 12:39, 13 октября 2022

Аппаратные средства защиты информационных систем — средства защиты информации и информационных систем, реализованных на аппаратном уровне. Данные средства являются необходимой частью безопасности информационной системы, хотя разработчики аппаратуры обычно оставляют решение проблемы информационной безопасности программистам.

Эта проблема привлекла внимание многих фирм, в том числе и такой как Intel. В 80-х годах была разработана система 432. Но проект постигла неудача. Возможно, именно после неудачи "гранда" другие фирмы отказались от этой идеи.

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

Общая модель защищенной системы

[править | править код]

Разработчиками Эльбруса была предложена следующая модель защищённой информационной системы [1].

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

Для описания системы введем понятия

  • узел
  • ссылка
  • контекст программы

Узел — ячейка данных произвольного объема вместе со ссылкой на неё из обрабатывающего устройства.

Ссылка не только описывает данные, но и содержит все права доступа к ним. Система должна обеспечивать контроль над тем, чтобы в операциях, использующих ссылки, не были использованы данные других типов а в операциях с аргументами других типов ссылка не могла быть модифицирована.

Контекст программы — множество всех данных доступных для вычислений в конкретном модуле.

Базовая функциональность модели защищенной информационной системы

[править | править код]

Создание узла произвольного объема для хранения данных

После появления новый узел должен быть

  • пуст
  • доступен только данному обрабатывающему устройству и только через данную ссылку

Удаление узла.

  • попытка использования ссылок на удаленные узлы должна приводить к системным прерываниям

Смена контекста или смена процедуры, исполняемой обрабатывающим устройством.

Новый контекст состоит из трех частей:

  • глобальные переменные, переданные по ссылке из старого контекста
  • часть, переданная копированием значения (параметры)
  • локальные данные, созданные в новом модуле

Общие методы и требования к переключению контекста:

  • Идентификация нового контекста (например, особая ссылка на него, позволяющая лишь переключаться между контекстами)
  • Непосредственно переключение контекста (исполнение старого кода после переключения контекста запрещено, исходя из принципов защищенности)
  • Операции формирования ссылки или другой структуры для идентификации и переключения контекста

Реализации могут быть разными (в том числе и без особых ссылок), но должны быть выдержаны основные принципы:

  • точки входа в контекст формируются внутри самого этого контекст
  • эта информация делается доступной другим контекстам
  • код и контекст переключаются одновременно

Анализ модели

[править | править код]
  1. Защищенность системы базируется на следующих принципах:
    • доступ к узлу имеет только модуль, создавший его, если только он добровольно не передаст ссылку кому-либо еще
    • множество данных, доступных модулю, в любой момент времени строго контролируется контекстом
  2. Результирующая защита предельно строгая, но она не ограничивает возможности программиста. Различные не пересекающиеся модули могут работать в одной программе, вызывая друг друга и обмениваясь данными. Для этого достаточно, чтобы каждый из них содержал особую ссылку для переключения контекста на другой.
  3. Построенная система значительно упрощает поиск и исправление ошибок благодаря строгому контролю типов. Например, попытка изменить ссылку сразу приведет к аппаратному прерыванию в месте ошибки. После чего её легко можно отследить и исправить.
  4. Обеспечивается модульность программирования. Неправильная работа программы никак не повлияет на другие. «Испорченный» модуль может лишь выдать неверные результаты.
  5. Для использования системы от программиста не требуется дополнительных усилий. Кроме того, при написании программы под такую модель уже нет необходимости дополнительно оговаривать права доступа, способы их передачи и т. д.

Архитектура Эльбрус

[править | править код]

В архитектуре Эльбрус для разграничения типов данных вместе с каждым словом в памяти хранится его тег. По тегу можно определить является ли данное слово ссылкой или принадлежит к какому-либо специальному типу данных.

Ссылки и работа с ними

[править | править код]

В ссылке содержится описание области (дескриптор), на которую она ссылается и права доступа. Дескриптор обязательно содержит базовый адрес и размер данных.

Возможны следующие форматы дескриптора:

  • дескриптор объекта
  • дескриптор массива

Дескриптор объекта служит для поддержания объектно-ориентированного программирования и содержит дополнительно описание приватной и публичной областей. Обращение в публичную область стандартно(сложение базового адреса и индекса вместе с последующим контролем размера. Если в командах обращения в память стоит признак приватных данных, то для разрешения обращения проверяется специальный регистр в процессоре, который хранит тип объекта, когда работают программы обработки данного типа. Таким образом, внутри программы становятся доступными приватные данные объектов этого типа.

При доступе к ячейке памяти проверяется корректность ссылки.

Важные операции для работы со ссылками:

  • индексация(выработка ссылки на элемент массива)
  • операция CAST для дескрипторов объекта(преобразование к базовому классу)
  • компактировка(уничтожает ссылки на удаленную память и плотно компактирует занятую память)

Контексты и методы работы с ними

[править | править код]

Контекст модуля состоит из данных хранящихся в оперативной памяти и в файлах, и подается в виде ссылки на регистры процессора.

Переключение контекста — это, по сути, вызов процедуры или возврат из неё. При запуске процедуры полный контекст исходного модуля сохраняется, а нового — создается. При выходе из процедуры её контекст уничтожается.

Реализация защищенного стека

[править | править код]

При реализации процедурного механизма в Эльбрусе, для повышения эффективности выделения памяти для локальных данных используется механизм стека.

Стековские данные подразделяются на три группы по своим функциональным характеристикам и уровню доступности для пользователя:

  • параметры, локальные данные и промежуточные значения процедуры, размещенные в оперативных регистрах(стек процедур);
  • параметры и локальные процедуры, размещенные в памяти(стек пользователя);
  • «связующая информация», описывающая предыдущую (запустившую) процедуру в стеке процедур(стек связующей информации);

Стек процедур предназначен для данных, вынесенных на оперативные регистры. Каждая процедура работает только в своем окне, которое может пересекаться с предыдущим окном областью параметров (она же является областью возвращаемых значений). Обращение за данными (для пользователя) возможно только в текущее окно, всегда расположенное на оперативных регистрах.

Стек пользователя предназначен для данных, которые пользователь считает нужным разместить в памяти.

Стек связующей информации предназначен для размещения информации о предыдущей (вызвавшей) процедуре и используемой при возврате. При защищенном программировании пользователь не должен иметь возможность изменять эту информацию, поэтому для неё выделен специальный стек, доступный только операционной системе и аппаратуре. Стек связующей информации устроен так же, как стек процедур.

Поскольку в стеке виртуальная память переиспользуется, встает проблема защиты данных. Она имеет два аспекта:

  • переиспользование памяти (выделение ранееосвобожденного пространства). В этой памяти могут, к примеру, оказаться ссылки, недоступные модулю при правильной работе
  • «зависшие» указатели(ссылки старого владельца на переиспользуемую память)

Первая проблема решается автоматической чисткой переиспользуемой памяти. Принцип решения второй проблемы следующий. Указатели на текущий фрейм процедуры можно сохранять только в текущем фрейме, либо передавать в качестве параметра в вызываемую процедуру (передавать вверх по стеку). Соответственно, указатель не может быть ни записан в глобальные данные, ни передан в качестве возвращаемого значения, ни записан в глубину стека.

Примечания

[править | править код]