gpt4 book ai didi

scala - 为什么不围绕整数溢出进行 Scala 设计?

转载 作者:行者123 更新时间:2023-12-04 21:52:09 25 4
gpt4 key购买 nike

我是一名前 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 产生巨大的性能影响。对于选择这种语言的开发人员来说,他们必须以该成本获得一些可见的东西。

对于许多操作,字符串对象的性能开销比 cstring 小得多。它们还为开发人员提供了非常明显的好处,这就是人们使用它们的原因,而不是安全本身。字符串对象可以通过 cstrings 轻松完成许多常见的事情。 BigInteger 没有提供这些。它需要完全相同的代码,但速度只是它的一小部分,但不会溢出(很少有开发人员每天都会看到的错误,即使安全人员更常看到它)。

等效的应该是一个 cstring(带有 strcmp、strcpy、strcat 等),它以一小部分速度运行,但不需要空终止符。我认为也没有多少人会立即使用它,无论这对以空字符结尾的字符串的安全性有多大帮助。如果语言需要它,我看不到很多人急于使用该语言。

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

如果该语言具有许多其他引人注目的功能,则从头开始的语言可能会摆脱无处不在的 BigInteger(如 Python),但要改造为一种想要从(以及与)Java 自然过渡的语言是一件非常困难的事情.

关于scala - 为什么不围绕整数溢出进行 Scala 设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26565820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com