OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 25 Апрель, 2024 01:35

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
СообщениеДобавлено: Суббота, 03 Июнь, 2006 00:26 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Обнаружил нюанас в метапрограммировании в ББ.
Предыстория: технически в ББ можно добраться до любого поля любой переменной/типа, будь он экспортированный, неэскпортированный либо локально объявленный - для этого нужно обращаться к Kernel, чего, естественно, из прикладных модулей делать не следует. А контроль на доступность объекта по его метке экспорта проверяется уже на уровне модуля Meta - если объект неэкспортированный, то возвращается пустой Item.

Однако синтаксически компилятор КП (по крайней мере, в BlackBox) допускает постановку метки экспорта для поля неэкспортированного типа. Я раньше думал, что просто для удобства программиста - чтобы для скрытия/открытия типа не приходилось перемечать все его поля. Однако обнаружилась интересная вещь - поля неэспортированных объектов, помеченные *, становятся доступны через Meta.

Можно провести эксперимент:
Код:
MODULE TempMetaTarget;

   IMPORT Meta;

   VAR
      rec: POINTER TO RECORD
         a: INTEGER
      END;
   
   PROCEDURE Do* ;
      VAR item, field: Meta.Item;
   BEGIN
      NEW(rec);
      Meta.GetItem(rec, item);
      ASSERT(item.Valid(), 20);
      item.Lookup("a", field);
      ASSERT(field.Valid(), 21)   
   END Do;

END TempMetaTarget.

Запустим процедуру Do - получим TRAP 21. Все правильно. Item по указателю получить можно, работать с неэкспортированными полями нельзя. Поставим после a звездочку - код будет работать, доступ к полю получен.

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

Однако возникает вопрос: Ominc сделали это намеренно или случайно? Как это согласуется со стандартом языка? Таким образом, при развитии BlackBox следует ли это а) сохранить и задокументировать б) сохранить, но не документировать и использование не поощрять в) посчитать ошибкой, "нарушением безопасности" и исправить Meta ?
Я лично склоняюсь к варианту а). Прошу высказывать мнения и предложения...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 03 Июнь, 2006 06:46 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Только если править то не Meta, а то место где видимость устанавливается в компиляторе. Что предпочтительнее, по-моему. Если поля всё-таки нужны - то можно пользоваться экспортированными типами или Kernel напрямую. Какие с ними проблемы?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 03 Июнь, 2006 15:42 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
а то место где видимость устанавливается в компиляторе.

Править компилятор - последнее дело... Как я уже сказал, "отрезания" доступа к закрытым полям ЦЕЛИКОМ делается на уровне Meta.
Цитата:
Если поля всё-таки нужны - то можно пользоваться экспортированными типами или Kernel напрямую. Какие с ними проблемы?

В том-то и дело, что Kernel использовать нежелательно, если можно обойтись без него.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 04 Июнь, 2006 06:31 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Илья Ермаков писал(а):
Цитата:
а то место где видимость устанавливается в компиляторе.

Править компилятор - последнее дело... Как я уже сказал, "отрезания" доступа к закрытым полям ЦЕЛИКОМ делается на уровне Meta.
В том-то и дело, что Kernel использовать нежелательно, если можно обойтись без него.
В том-то и дело, что обсуждаемые поля компилятором не закрываются. Что противоречит способу использования этих полей. А почему экспортированный тип не использовать? Илья, Вы так и не сказали. Тогда можно и без Meta обойтись, насколько я понимаю.
P.S. В крайнем случае компромисный вариант б вполне устроит тех, кто ничего об этом не знал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 04 Июнь, 2006 10:48 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
А почему экспортированный тип не использовать? Илья, Вы так и не сказали. Тогда можно и без Meta обойтись, насколько я понимаю.


Я уже привел пример. У меня есть модуль, работающий с базой данных. Я не знал про обсуждаемый нюанс и был вынужден открывать все типы, которые я читаю/пишу из базы через SqlDB, т.к. SqlDB работает именно через Meta (и правильно сделано, это не системный модуль. Если Stores "позволительно" работать через Kernel, то прикладным подсистемам уже нежелательно к нему привязываться). Мне нравится вариант не открывать целиком типы, а открыть только некоторые поля, которые должны считываться из базы. В принципе, такое поведение Meta/компилятора логично - каждый элемент имеет свою метку доступа. Если поле имеет метку доступа, а тип в целом не имеет, то служебные операции могут быть выполнены на полях, но не могут - на типе в целом. Брешей в безопасности это не создает.
Я сделаю проще - спишусь с Ominc и проясню ситуацию - было ли это сделано случайно или намеренно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 05 Июнь, 2006 05:19 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Хорошо, а какие бреши в безопасности создает открытый тип? Если мне это будет понятно - то я, пожалуй, и соглашусь, что не стоит его открывать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 05 Июнь, 2006 11:39 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Проблема не в безопасности, а в том, что нет необходимости засорять интерфейс модуля типами, которые используются только внутри самого модуля.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 05 Июнь, 2006 16:02 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
А почему не используется? Хотелось бы именно его и использовать. Тогда не придется Meta импортировать. Быстрее будет работать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 05 Июнь, 2006 17:26 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Вы, видимо, слабо понимаете механизм метапрограммирования. Meta предназначен для того, чтобы ваш код мог работать с теми типами, о которых он вообще ничего не знает на этапе выполнения.
SqlDB.Table.Read(row: INTEGER; rec: ANYREC) ничего не знает и знать не может про ваши конкретные типы. Через Meta происходит разбор структуры записи и заполнение ее данными из таблицы. Только в данный момент для того, чтобы работать со своим типом через SqlDB и аналогичные сервисы, приходится обязательно его экспортировать. Иначе SqlDB не найдет в нем ни одного поля и данные туда не занесет по понятным причинам. У меня, например, в библиотеке есть процедура ZeroRec, которая инициализирует нулями и "" любую запись, но она также работает только с экспортированными записями. Я могу, конечно, переписать через Kernel, но пока мне это не нужно. Модулю Stores как сердцу Framework'a, позволительно привязываться к Kernel, пользовательским модулям - нежелательно.
В любом случае ждем ответа от Ominc - если текущее поведение Meta является не ошибкой, а сознательным решением, то тут и обсуждать нечего...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 05 Июнь, 2006 21:32 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Я лишь высказал пожелание использовать открытые типы там, где Meta не нужен, не сужая тему противоположным случаем. Я себе представлял, что и Вы не только метапрограммирование имели в виду. Извините, если это было не так.
Если речь вести о вещах не связанных с метапрограммированием, считаете ли Вы полезным иметь возможность доступа к полям не экспортируемого объекта?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 05 Июнь, 2006 22:02 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
GUEST писал(а):
Если речь вести о вещах не связанных с метапрограммированием, считаете ли Вы полезным иметь возможность доступа к полям не экспортируемого объекта?

Так такой доступ и есть только через метапрограммирование... На этапе компиляции сам тип недоступен, никакие действия с ним недоступны.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 06 Июнь, 2006 04:21 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Хотя вопрос предполагал два ответа, Вы, Илья, нашли третий.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB