Мелкозернистая песочница - PullRequest
2 голосов
/ 12 октября 2009

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

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

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

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

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

Это не обязательно должно быть выполнимо в существующей виртуальной машине, такой как Java или Python; если для этого варианта использования необходимо создать виртуальную машину, пусть будет так.

Существуют ли уже известные решения (или нерешения, то есть вещи, которые, как известно, не работают) для этой проблемы?

Ответы [ 3 ]

1 голос
/ 06 февраля 2010

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

Но если вы готовы требовать большего от своего поставщика функций, вопрос заключается в том, чтобы получить код подтверждения (PCC) в качестве ответа. Я предполагаю, что вы знаете о работе Necula, которая особенно заботилась о том, чтобы код ассемблера соблюдал ограничения на использование памяти, например, не вмешивался в состояние вне области видимости; вы можете не знать о работе по автоматическому выводу доказательств в довольно распространенных случаях: возможно, PCC является более простым вариантом, чем вы думаете.

1 голос
/ 06 февраля 2010

Я и многие другие ранее создали языки для целей генетического программирования. Если создание нового языка является опцией, то такие решения уже существуют. Поскольку существуют методы для автоматического создания функций, создание библиотек функций должно быть тривиальным. Эта система, по сути, представляет собой среду в песочнице. Любые побочные эффекты этих функций будут ограничены доступным пространством программы.

1 голос
/ 12 октября 2009

Я думаю, песочница - это ваш единственный выбор. Попытка проанализировать программу и определить, является ли она безопасной, является эквивалентом проблемы остановки. CLR имеет встроенную систему безопасности, которая допускает подобные ограничения, я думаю, у Java есть подобные. Я не думаю, что Python делает.

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