13.17 判断一个函数是否可以安全调用

某些主模式(例如 SES)会调用存储在用户文件中的函数。(关于 SES 的更多信息,see Simple Emacs Spreadsheet。)用户文件的来源往往不可靠 —— 你可能从刚认识的人那里得到一个表格文件,或是通过邮件从陌生人手中获取。因此,在确认安全之前,直接调用源代码保存在用户文件中的函数是有风险的。

Function: unsafep form &optional unsafep-vars

form 是一个 安全的(safe) Lisp 表达式,则返回 nil;若表达式可能存在安全风险,则返回一个描述风险原因的列表。参数 unsafep-vars 是一个符号列表,代表当前上下文已知的、拥有临时绑定的符号;该参数主要用于函数内部的递归调用。当前缓冲区是一个隐式参数,会提供缓冲区本地绑定的列表。

unsafep 函数的设计原则是快速且简洁,因此仅会执行非常浅层的分析,这导致它会判定许多实际安全的 Lisp 表达式为 “不安全”。目前尚未发现 unsafep 对不安全表达式返回 nil 的情况。但需要注意:一个本身安全的 Lisp 表达式,可能返回带有 display 属性的字符串 ——该属性中可包含关联的 Lisp 表达式,且这部分表达式会在字符串插入缓冲区后执行。这类关联表达式可能具有恶意。为保证安全,你必须在将用户代码计算得到的所有字符串插入缓冲区之前,删除其中的所有属性。

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike