加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么scala围绕Integer Overflow设计?

发布时间:2020-12-16 18:25:01 所属栏目:安全 来源:网络整理
导读:我是一名前 Java开发人员,最近我观看了Venkat Subramaniam教授( https://www.youtube.com/watch?v=LH75sJAR0hc)为Java开发人员提供的有趣的Scala介绍. 引入的一个要点是消除声明的类型而不是“类型推断”.据推测,这意味着高阶编译器通过上下文识别我打算使用
我是一名前 Java开发人员,最近我观看了Venkat Subramaniam教授( https://www.youtube.com/watch?v=LH75sJAR0hc)为Java开发人员提供的有趣的Scala介绍.

引入的一个要点是消除声明的类型而不是“类型推断”.据推测,这意味着高阶编译器通过上下文识别我打算使用的类型.

作为交易的应用程序安全专家,我试图做的第一件事就是破解这种类型的推理……例如:

// declare a function that returns the square of an input Int. The return type is to be inferred.
scala> val square = (x:Int) => x*x
square: Int => Int = <function1>
// I can see the compiler inferred an Int for the output value,which I do not agree with.

scala> square(2147483647)
res1: Int = 1
// integer overflow

我的问题是为什么编译器没有看到“*”是一个有溢出威胁的运算符,并将输入包装成像BigInteger一样更具保护性的东西?

根据教授的说法,我应该忘记内部实现,然后继续我的业务逻辑.但是在我的快速演示之后,我不太确定Scala对于那些不了解编译器在我的方法中做什么的程序员来说是安全的.

解决方法

我认为@rightf?ld在某种程度上夸大了溢出发生或不发生的频率(特别是在考虑一个积极试图溢出你的攻击者时).但我同意他的基本观点.将所有数学转换为BigInteger几乎肯定会对Java产生巨大的性能影响.对于开发人员来说,选择这样一种语言,他们必须得到一些可见的成本.

对于许多操作,字符串对象比cstrings具有小得多的性能开销.它们还为开发人员提供了非常明显的好处,这就是人们使用它们的原因,而不是安全性本身.字符串对象很容易在cstrings上做很多常见的事情. BigInteger没有提供这些.它只需要一小部分速度完全相同的代码,但不会溢出(很少有开发人员日常看到的错误,即使安全人员经常看到它).

等效的是一个cstring(strcmp,strcpy,strcat等)以一小部分速度运行,但只是不需要null终止符.我不认为很多人会跳过使用它,无论多少都有助于安全性,而不是以空终止的字符串.如果语言需要它,我不会看到很多人急于使用这种语言.

正如@rightf?ld在评论中所暗示的那样,与Java的互操作性将会被破坏,因为大多数(如果不是全部)数字都会成为BigInteger.您不断进行转换,这会增加溢出的相同危险,同时增加大量代码复杂性(以及更多性能影响).

如果该语言具有许多其他引人注目的功能,那么从头开始语言可能会随处可见BigInteger(如python),但是将一种语言改造成希望自然转换为(和使用Java)的语言是一件非常困难的事情. .

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读