首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell -安全可靠的扩展

Haskell -安全可靠的扩展
EN

Stack Overflow用户
提问于 2020-05-07 10:08:39
回答 1查看 302关注 0票数 4

看看hackage中的一些代码,我偶然发现了SafeTrustworthy扩展。

广义上(或者也确切地说.)是什么意思?在什么时候使用它们,什么时候不使用,有一个好的经验法则吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-07 10:29:00

安全Haskell在本质上是Haskell语言的一个子集。它旨在禁用经常使用的某些“技巧”,例如unsafePerformIO :: IO a -> a,此外,它还(旨在)保证您不会以某种方式访问某个模块的私有函数、数据构造函数等,从而阻止这些模块的访问。简而言之,安全Haskell保证三件事:

  1. 参考透明度;
  2. 模块边界控制;以及
  3. 语义一致性

安全模块必须遵循这些限制,而且只能使用安全模块。当然,安全模块并不意味着它使用的代码是正确的,或者IO操作不能是恶意的。但是它有一些保证,因为如果一个函数的类型没有IO,那么通常该模块不应该以不安全的方式执行IO

在安全Haskell中,某些扩展,如TemplateHaskell和指定{-# RULES … #-}实用程序是不允许的。其他扩展(如DeriveDataTypeable )是允许的,但前提是使用deriving子句生成实例,因此不能生成自定义实例。

然而,有些模块需要使用扩展才能正常工作。在这种情况下,作者可以将模块标记为Trustworthy。这意味着作者声称该模块公开了一个安全的API,但它内部需要处理一些不安全的扩展、转换等,因此编译器无法保证安全性。

这些扩展记录在文献资料中。

Safe扩展引入了以下三种语言标志:

  • XSafe -启用安全语言方言,请GHC保证信任。安全语言方言要求所有导入都是可信的,否则将发生编译错误。
  • XTrustworthy -意味着虽然这个模块可能在内部调用不安全的函数,但是模块的作者声称它导出了一个不能以不安全的方式使用的API。这不启用安全语言,也不对允许的Haskell代码设置任何限制。信任保证是由模块作者提供的,而不是GHC。如果导入的模块不受信任,带有安全关键字的导入语句将导致编译错误。没有关键字的import语句会像往常一样运行,并且可以导入任何模块,无论是否可信。
  • XUnsafe --将正在编译的模块标记为不安全的,以便使用-XSafe编译的模块不能导入它。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61655158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档