2012-03-19 1 views
5

Очевидно, Mathematica может удалить этот атрибут; это просто не позволяет мне. Кто-нибудь знает какие-либо хаки, чтобы заставить Mathematica делать то, что я говорю?Любой способ заставить Mathematica удалить атрибут Locked?

+0

«Заблокировано» - это атрибут, который после назначения предотвращает модификацию любых атрибутов символа «Я не знаю, почему вы говорите, что это», очевидно, может удалить этот атрибут ». Возможно, вы хотите удалить «ReadProtected» вместо этого? Просто объясните, что вы хотите сделать. – Szabolcs

+0

@Szabolcs Я предполагаю, что он пытается обойти меры безопасности * Mathematica. –

+0

Почему?Что вы пытаетесь сделать, выполняя это? – rcollyer

ответ

3

Это не положительный ответ.

Один конкретный случай использования, который может требует удаления атрибута Locked, является локальной модификацией символа, например. Internal InheritedBlock`. Часто эта схема определения используется для изменения/удаления атрибутов локально системных символов, чтобы дать другое поведение для области действия блока (см., Например, this answer).

Однако, согласно моим исследованиям, из 38 Locked символов (из всех контекстов и пакетов, загруженных с Quiet[Needs /@ Contexts[]]!) никто не имеет каких-либо других функциональных атрибутов, что, если он был изменен, будет приводить к модифицированному поведению (например, нет Flat, Orderless, Hold*** и т. Д.) И Ни один из них не имеет Options, которые могут быть изменены. Обычно эти символы являются очень базовыми, почти все из контекста System`, например. I, List или True. Только 3 исключения, имеющее либо функциональные атрибуты или опции являются:

(* Symbol *)     (* Attributes *)    (* Options *) 
Remove      {HoldAll, Locked, Protected} {} 
$ProductInformation   {Locked, Protected}   {"ProductIDName" -> "Mathematica", "ProductKernelName" -> "Mathematica 9 Kernel", "ProductVersion" -> "9.0 for Microsoft Windows (64-bit) (January 25, 2013)", "ProductVersionNumber" -> 9.} 
Developer`StartProtectedMode {Locked, Protected}   {"Allow" -> Null, "Deny" -> Null, "Execute" -> {}, "Read" -> {}, "ReadWrite" -> {}, "Write" -> {}} 

Таким образом, помимо изменения этих дистанционно используемых функций, только reasone один хотел бы удалить Locked чтобы непосредственно изменять определения некоторого символа. Но это может быть выполнено только iff символ также есть ReadProtected, в противном случае код написан ниже, чем Mathematica -уровень, полностью скрытый от пользователя (за исключением, возможно, высокоуровневых оберток). Есть только три таких символа (опять же, из всех стандартных контекстов и пакетов):

I     (* with {Locked, Protected, ReadProtected} *) 
$InputStreamMethods (* with {Locked, Protected, ReadProtected} *) 
$OutputStreamMethods (* with {Locked, Protected, ReadProtected} *) 

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

Кроме того, поскольку Locked сам имеет атрибут Locked (так как v9, в v8 это был только Protected), он не может быть перенаправлен, например. Locked = Sequence[] перед загрузкой пакета для обхода безопасности даже для зашифрованных файлов. Можно было переопределить Attributes и SetAttributes перед загрузкой пакетов, но бог знает, что может пойти не так, если это будет сделано.

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

+1

Ничего себе, я не думал, что на самом деле когда-нибудь будет достойный ответ, размещенный здесь. Тем временем я разместил в своем блоге (http://flarn2006.blogspot.com/2013/02/disabling-mathematicas-locked-attribute.html) об этом, включая предложение 'Sequence []'. Для Mathematica 9 вы все равно можете вручную переименовать атрибут Locked в 'mathdll.dll', поэтому он будет рассматриваться как недопустимый атрибут. – flarn2006

+0

Ahh, извините, я не понимал, что это ваш блог: я нашел его, даже включил его в ответ, а затем удалил из-за обсуждения чата (http://chat.stackexchange.com/transcript/message/ 11536692 # 11536692) над * Mathematica * .SE не поднять напряженность. –

+0

@ flarn2006 Я думаю, что очень сомнительно делиться такой информацией публично, поскольку она важна для безопасности. Если вы не хотите, чтобы вы видели его код, потому что его собственная интеллектуальная собственность, вы должны уважать это. Ваш вопрос, похоже, нацелен на то, чтобы читать определения кодированных пакетов, а не изучать что-то о построении функций или о его законном использовании. Я могу понять ваши хакерские взгляды, но, пожалуйста, не разделяйте это публично. – sacratus

 Смежные вопросы

  • Нет связанных вопросов^_^