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

欢迎!请参见关于页面以获取有关此功能的一些更多信息。

+6
Collections
编辑

这是预期行为吗?

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与此在APersistentVector中的此行相关。其他两个是由相似的周围行引起的。

2 个答案

+1

选定
 
最佳答案

Java收集接口以int索引(最大计数=2147483647)。总的来说,如果您的集合中有超过20亿个项,您可能会有其他问题。

我可以说索引超出范围(0 Integer/MAX_VALUE)的行为是未定义的。

同意,但这个集合里只有3个条目,所以可能是这个传统观念的前提在这里不成立?(对第一句话的回应)
好的,感谢考虑!
关于字符串/数组也存在类似的行为

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

编辑了

我认为这个报告可能导致代码库中更严重的问题,特别是在 `get` 函数的文档字符串中没有提供任何警告的情况下。

据我所知,以下常用的编程风格在社区中非常普遍。

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

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

如果上面提到的值 `5` 是用户提供的或某些可能出错的操作的结果,我们可能会引发难以发现的错误甚至安全漏洞。

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

我知道这并不是完全相同的问题,但我认为这个条目的观点适用于我们的情况。

范围
保密性
完整性

"超出数组边界的索引可能导致越界读取或写入操作,或者对错误对象的操作;即,'缓冲区溢出'并不总是结果。这可能导致敏感数据的泄露或修改。”

我预期当使用超出其边界的索引访问 ARRAY 时,答案应该保持为 nil 值。

...