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中,但语法高亮似乎截断了最后一部分)。

AFAICT,get 与APTersistentVector中的这一行相关。其他两个是由相似的上下文行引起的。

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

我知道这并不是完全相同的问题,但在这里,我同意这个条目的观点

范围
机密性
完整性

“使用超出数组边界之外的索引可能会触发越界读取或写入操作,或者对错误对象的操作;也就是说,“缓冲区溢出”并不总是结果。这可能导致敏感数据的泄露或修改。”

我预计访问数组时,如果索引超出其范围,应该保持 nil 值作为答案。

...