跳到内容
新问题

有关于这个项目的问题吗?注册一个免费的GitHub帐户以打开一个问题,并联系其维护者和社区。

单击“注册GitHub”,表示您同意我们的服务条款隐私声明。我们偶尔会向您发送与帐户相关的电子邮件。

已经在GitHub上了?登录到您的帐户

哈希设置Fn的计算maxSize(最大大小)可能导致溢流在函子实例化期间 #279

关闭
12项任务中的2项
Skyb0rg007已打开此问题2023年5月25日·7条评论
关闭
12项任务中的2项
受让人
标签
缺陷 有些东西不起作用了 固定在110.99.4中 将在110.99.4版本中修复的问题 smlnj-lib公司 SML/NJ库或Util组件的一般问题

评论

@Skyb0rg007
复制链接
贡献者

Skyb0rg007 评论2023年5月25日

版本

110.99.3(最新)

操作系统

  • 任何
  • Linux操作系统
  • macOS操作系统
  • 窗户
  • 其他Unix

操作系统版本

无响应

处理器

  • 任何
  • 手臂(使用Rosetta)
  • PowerPC公司
  • 斯巴达克
  • x86(32位)
  • x86-64(64位)
  • 其他

系统组件

SML/NJ图书馆

严重程度

专业

描述

这个哈希设置Fn函子(hash-set-fn.sml)计算maxSize(最大大小)2的最大幂仍小于阵列最大长度.
然而,计算无法正确处理以下系统Int.maxInt=某些阵列.maxLen,导致在函子实例化过程中引发异常。

注意:SML/NJ编译器上不会出现此错误,因为阵列最大长度远小于整数最大整数.
该问题对于MLton(最新版本:20230523-gd082c4a36)来说是可复制的,因为SOME数组.maxLen=Int.maxInt.

成绩单

(*test.sml*)结构X=HashSetFn(结构类型hash_key=intval hashVal=文字.来自Intval sameKey:int*int->bool=op=结束)val()=打印“好的!\n”(*测试.mlb*)$(SML_LIB)/基础/基础.mlb$(SML_LIB)/smlnj-LIB/Util/smlnj-LIB.mlb测试.sml$mlton-输出a.out测试.mlb$ ./a.输出未处理的异常:溢出$#“-default type intinf”标志使Int.Int具有无限精度,但保持Array.maxLen不变$mlton-输出a.out-默认类型intinf test.mlb$ ./a.输出可以!

预期行为

实例化哈希设置Fn不应该提高溢流.

复制步骤

只需运行抄本中的代码。

其他信息

可以通过修改hash-set-fn.sml中第37行的代码来解决此问题:

(*旧*)val maxSize=let乐趣fi=让val i’=i+i在里面如果i'<Array.maxLen,则f i'else i结束在里面f 0x10000结束(*新*)val maxSize=let乐趣fi=让val i’=i+i在里面如果i'<Array.maxLen,则f i'else i结束句柄溢出=>i在里面f 0x10000结束

电子邮件地址

ssoss AT uchicago DOT教育

@Skyb0rg007 Skyb0rg007补充这个缺陷 有些东西不起作用了标签2023年5月25日
@马修·弗莱特
复制链接

MLton对其提供的SML/NJ库进行了修补,以避免出现类似问题结构HashTableRep(请参见https://github.com/MLton/MLton/blob/b1f1f0f0916d28c0d183fba85549d5bf96f1fa41/lib/smlnj-lib/smlinj-lib.patch#L4498-L4510号).

@Skyb0rg007
复制链接
贡献者 作者

我会在那里重新提交这份报告。然而,我仍然认为这应该在SML/NJ回购中得到解决,如果只是为了防止未来发生阵列最大长度增加或整数最大整数减少。

JohnReppy公司添加了提交引用的这个问题 2023年5月25日
@JohnReppy公司 JohnReppy公司补充smlnj-lib公司 SML/NJ库或Util组件的一般问题 固定在110.99.4中 将在110.99.4版本中修复的问题标签2023年5月25日
@JohnReppy公司
复制链接
贡献者

我推了一个计算楼层的修正(log2(阵列最大大小))用作maxSize(最大大小)哈希表的限制。

@马修·弗莱特
复制链接

楼层(log2(阵列最大大小))在以下情况下不稳健结构字=字32结构Int=IntInf; 通常,如果默认单词大小小于默认整数大小。

$猫z.smlval maxSize=letfun-lp(0w0,k)=单词.toIntX(单词.<<(0w1,k-0w1))|lp(w,k)=lp(单词.>>(w,0w1),k+0w1)在里面lp(来自Int数组的字.maxLen,0w0)结束val _=打印(concat[“maxSize:”,Int.toString maxSize,“\n”])$mlton-默认类型intinf z.sml$ ./z(z)最大尺寸:~2147483648

JohnReppy公司添加了提交引用的这个问题 2023年6月14日
大小转换为内部“MaxHashTableSize”结构。
@JohnReppy公司
复制链接
贡献者

重写代码以仅使用国际模块,所以现在应该可以移植了。

@马修·弗莱特
复制链接

这个最大桌子尺寸.sml提交中未添加文件。

@JohnReppy公司
复制链接
贡献者

我在最初提交时错过了它,但我大约在4小时前添加了它。

免费注册 在GitHub上加入此对话.已经有帐户了吗?登录以发表评论
标签
缺陷 有些东西不起作用了 固定在110.99.4中 将在110.99.4版本中修复的问题 smlnj-lib公司 SML/NJ库或Util组件的一般问题
项目
还没有
开发

没有分支或拉请求

3名参与者