一个来自外星的巨大的OCaml程序需要修复。其中一个问题是,程序在看似无害的一行代码崩溃了:
Hashtbl.mem loc_to_no loc
出现“内存不足”异常。问题在于肯定有足够的内存,而且对于其他输入甚至在处理问题之前,这行代码也能正常执行。
使用OCAMLRUNPARAM="v=63"
运行它后,我看到在崩溃之前打印了一行:
结构比较中的堆栈溢出
涉及的结构如下所示。loc
的类型为location
。
type ('a, 'b, 'c) automaton = {
aut_id : int ;
mutable start_location : (('a, 'b, 'c) location) option ;
mutable end_location : (('a, 'b, 'c) location) option ;
mutable aut_attributes : 'a ;
}
and ('a, 'b, 'c) location = {
loc_id : int ;
mutable succs : ('c * ('a, 'b, 'c) location) list ;
mutable preds : ('c * ('a, 'b, 'c) location) list ;
automaton : ('a, 'b, 'c) automaton ;
mutable loc_attributes : 'b ;
}
如何使代码执行?
=
来比较键,这是递归的。我创建了一个函数对象,用于使用==
进行比较,该运算符不会递归比较。 - P Shved