2024 Clojure状态调查!分享您的想法。

欢迎!请参阅关于页面了解更多关于如何工作的信息。

+6
集合
编辑

这是预期的行为吗?

clj
Clojure 1.10.3
user=> (get [1 2 42] 4294967295)
nil
user=> (get [1 2 42] 4294967296)
1
user=> (get [1 2 42] 4294967297)
2
user=> (get [1 2 42] 4294967298)
42
user=> (assoc [1 2 42] 4294967298 :wow)
[1 2 :wow]
user=> (find [1 2 42] 4294967298)
[4294967298 42]
user=> (.intValue 4294967298)
2

(注意这是在Clojure 1.10.3中,但语法高亮似乎截断了最后一部分)。

据我所知,get这个相关。其他两个是由类似的周围行引起的。

2 答案

+1

选定
 
最佳答案

Java 集合接口是按照整数索引的(最大数量 = 2147483647)。一般来说,如果您的集合中有超过20亿个项目,可能还会有其他问题。

我认为索引超出范围(0到整数的最大值)的行为是不确定的。

by
同意,但这个集合中只有3个项目,所以或许这个传统智慧的预设在这一点上并不成立?(对第一句话的回答)
by
好的,感谢考虑!
by
顺便说一下,对于字符串/数组也存在类似的行为

Clojure 1.10.3
user=> (get (into-array [1 2 42]) 4294967296)
1
user=> (get "123" 4294967296)
\1
user=> (get (into-array [1 2 42]) 4294967296 :not-found)
1
user=> (get "123" 4294967296 :not-found)
\1
+6
by
edited by

我认为这个报告可能导致代码库中更严重的问题,尤其是因为例如在 `get` 的文档字符串中没有给出警告。

我认为以下惯用语句在社区中非常常见

(get [1 2 3] 5)
;;=> nil

(get [1 2 3] 5 100)
;;=> 100

如果上面值5是用户提供的或者某些可能导致错误的数学运算的结果,我们可能会很困难找到错误,甚至可能导致安全漏洞。

这种索引越界错误可能会导致各种问题,这个CVE对此类情况有一些担忧(https://cwe.mitre.org/data/definitions/129.html)

我知道这并不是完全相同的问题,但我认为这条条目中的观点可以适用于我们这里的案例。

范围
机密性
完整性

"在使用超出数组边界的索引时,也可能触发越界读取或写入操作,或者对错误对象的操作;即,‘缓冲区溢出’不总是结果。这可能导致敏感数据被暴露或修改。”

我期望在通过索引访问超出数组边界的数组时,将nil值作为答案。

...