- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Racket 提供 protect-out
防止模块导出与 eval (或解构的语法对象)一起使用,除非模块具有足够的权限(又名,具有 strong enough code inspector )。文档还提供了一个很好的例子来说明它的作用:
> (module nest racket
(provide num-eggs (protect-out num-chicks))
(define num-eggs 2)
(define num-chicks 3))
> (define weak-inspector (make-inspector (current-code-inspector)))
> (define (weak-eval x)
(parameterize ([current-code-inspector weak-inspector])
(define weak-ns (make-base-namespace))
(namespace-attach-module (current-namespace)
''nest
weak-ns)
(parameterize ([current-namespace weak-ns])
(namespace-require ''nest)
(eval x))))
> (require 'nest)
> (list num-eggs num-chicks)
'(2 3)
> (weak-eval 'num-eggs)
2
> (weak-eval 'num-chicks)
?: access disallowed by code inspector to protected variable
from module: 'nest
at: num-chicks
eval
有一个足够强大的代码检查器(因为它是在最初需要模块的同一范围内调用的),因此能够获得导出。但是,
weak-eval
没有,因为它获得了相同的模块实例,但使用较弱的检查器用于
eval
ing。
protect-out
?是否应该始终使用(或至少在可能的情况下)?或者有没有具体的工作流程
protect-out
是为?
最佳答案
使用protect-out
对于不安全的导出,其中不安全的意思是具有违反 Racket 语言或虚拟机规则的能力。特别是,经常有可能通过滥用不安全的功能使 Racket VM 崩溃。
不安全功能的示例:
unsafe-vector-set!
或多或少允许您写入任意内存位置,可能会违反 GC 的不变量、Racket 在内存中的值表示的不变量等 unsafe-vector-ref
看起来不那么危险,但你可以使用它来从闭包中提取自由变量的值,即使 Racket 语言不允许检查过程的实现 ffi/unsafe
显然是不安全的#lang racket
(require ffi/unsafe ffi/unsafe/define)
(define-ffi-definer define-c #f) ;; searches libc, etc
(define-c fopen (_fun _path (_bytes = #"a") -> _pointer))
(define-c fclose (_fun _pointer -> _void))
(define-c fwrite (_fun _bytes _size _size _pointer -> _size))
(define (append-to-file path buf)
(define fp (fopen path))
(unless fp (error "couldn't open file"))
(fwrite buf (bytes-length buf) 1 fp)
(fclose fp))
(provide append-to-file)
append-to-file
程序。它是使用不安全特性(FFI)定义的,但 FFI 类型为
_path
和
_bytes
将拒绝错误的 Racket 值,因此使用
append-to-file
应该不可能使 Racket 崩溃.
append-to-file
程序仍然不安全(尽管可能不像
unsafe-vector-set!
那样具有灾难性的不安全性),因为它绕过了 Racket 的安全防护机制。该过程在另一个方面是不安全的,因为
fopen
和
fwrite
可以阻塞,并且 Racket 代码不应该阻塞。
protect-out
提供了 Racket 核心库中的不安全操作.如果您使用它们来定义您自己的不安全操作,您应该使用
protect-out
提供派生的不安全操作。也。如果你使用不安全的特性来定义一个安全的特性,那么你可以正常提供(即不带
protect-out
),但首先要仔细考虑!
#%variable-reference
),您还应该保护它,因为它可用于动态访问不安全的功能。
关于module - 我什么时候应该在 Racket 中使用 `protect-out`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51752449/
这个问题在这里已经有了答案: How to make a property protected AND internal in C#? (8 个答案) 关闭 9 年前。 我需要声明一个既受又 内部保
我有以下代码: class Base{ protected val alpha ="Alpha"; protected def sayHello = "Hello"; } class
我正在尝试运行一个宏来创建一个工作正常的pdf。 Excel 文件获得签名后,Excel 文件将自动受到保护。 问题:我的工作表上有一个按钮,需要按下该按钮才能创建 pdf 文档网。然而,这是无法完成
子类需要能够使用种子随机数生成器。 使用的优点和缺点是什么 public abstract class AbstractClass { protected Random rnd; public
我们有两个类(class)(A 和 B)。 A类只能由继承它的类创建(A类)B 类可以由用户创建。 A 类,版本 1 有一个private 数据成员,并且有方法访问 A 类中的数据。 A 类,版本 2
当父类受到保护时,我对继承类的默认构造函数有疑问,在我看来,子类也会有一个默认构造函数受到保护,但事实并非如此。 除了在子类上强制默认构造函数外,还有其他方法可以强制保护默认构造函数吗? C++11
我有一个抽象类,我想在其 protected 构造函数中初始化一个只读字段。我希望这个只读字段在派生类中可用。 按照我将所有字段设为私有(private)并公开属性的习惯,我实现如下: abstrac
我在运行大数据时遇到错误。错误已由以下示例示例解释 加载数据 mdata <- as.matrix(read.table('https://gubox.box.com/shared/static
我在获取 时遇到问题非法访问错误 对于以下示例: 我在名为 arch 的 gradle 模块中声明了一个基类 abstract class BaseClass { protected abst
我相信通过 实现 JSF 应用程序的安全性+ + & 通过使用 是两种不同的方式!?他们是吗? 我尝试通过上述第一种方法(使用 + + )来实现安全性,但发现使用 protected 和不
有没有办法确定以下的二传手能见度差异: public Prop { get; protected set; } protected Prop { get; set; } 使用反射?还是那些与 C# 反
我读了一本关于 OOP 的书,并且关于“ protected ”访问修饰符的示例对我来说很奇怪。 例子总结 这个例子是为了测试“protected”保留字对变量的影响。 ClassA 有 2 个 pr
内部——在集会上公开,在其他地方私有(private)。 protected - 只有派生类可以访问父类成员。 Protected internal - protected OR internal -
我有一个类代表 Wicket 中带有“返回”、“前进”和“取消”按钮的基本页面。但并非所有页面都有所有按钮,例如。 G。第一页明显没有“返回”。 我的想法是定义一个通用的ActionHandler p
在了解到嵌套类是嵌套类的成员并因此可以完全访问嵌套类的成员这一事实后(至少对于 C++11,请参见 here),我在尝试创建嵌套类模板: #include using namespace std;
我刚刚使用了 Resharper,并一直在尝试将字段转换为属性。我希望这些属性受到保护,但 Resharper 不想给我这个选项。相反,只有一个 protected 内部选项。这让我思考。要么某处有一
这是 question 的扩展一个小时前问过。 当覆盖派生类中的虚方法时,我们不能修改访问修饰符。考虑 System.Web.UI 命名空间中的 Control 类 public class Cont
有人可以解释一下 C# 中 protected 和 protected internal 修饰符之间的区别吗?看起来他们的行为是相同的。 最佳答案 “protected internal”访问修饰符是
我想知道下面两行代码之间是否有区别: protected $var = null; protected $var; 我已经看到两者都被使用了,我想知道这是否只是一个偏好问题,(也就是 $var; 将变
我正在尝试使用mockito为“另存为”操作编写单元测试。该操作的一部分是制作并显示一个文件对话框,用户可以在其中输入要保存的文件。选择文件不是我可以自动化的操作,因此我想模拟 FileDialog
我是一名优秀的程序员,十分优秀!