You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Original bug ID: 1878 Reporter: administrator Status: closed Resolution: fixed Priority: normal Severity: minor Category: ~DO NOT USE (was: OCaml general)
this one is unsafe : the fact that a is a block with a tag
Obj.double_tag doesn't proof that the same is true for b even if a and
b have the same type :
let i1 = Lazy.lazy_from_val 0.0;;
val i1 : float Lazy.t = lazy 0.
let o1 = Obj.repr i1;;
val o1 : Obj.t =
Obj.is_block o1;;
: bool = true
Obj.tag o1 = Obj.double_tag;;
: bool = true
let i2 = lazy 3;;
val i2 : int lazy_t =
let o2 = Obj.repr i2;;
val o2 : Obj.t =
Obj.is_block o2;;
: bool = true
Obj.tag o2 = Obj.double_tag;;
: bool = false
both i1 and i2 have the same type, but only the first one is a block of
tag Obj.double_tag. A verification have to be done for both argument.
Very interesting: you have found an unsoundness in the ocaml compiler.
Using your example combined with arrays we obtain:
i.e., the second lazy is assumed to be a float value, and results in a
wrong result (clearly 1.0 is not anything close to 4.32e-311)
So my take on this is that the code suggested for min is correct, this
is the compiler which is wrong: two values with the same type must
have the same representation.
A new headache for implementers...
Jacques Garrigue
The text was updated successfully, but these errors were encountered:
Original bug ID: 1878
Reporter: administrator
Status: closed
Resolution: fixed
Priority: normal
Severity: minor
Category: ~DO NOT USE (was: OCaml general)
Bug description
From: Remi Vanicat vanicat@labri.u-bordeaux.fr
Very interesting: you have found an unsoundness in the ocaml compiler.
Using your example combined with arrays we obtain:
let arr = [|Lazy.lazy_from_val 0.0; lazy 1.0|];;
val arr : float Lazy.t array = [|lazy 0.; lazy 4.32681603021051e-311|]
i.e., the second lazy is assumed to be a float value, and results in a
wrong result (clearly 1.0 is not anything close to 4.32e-311)
So my take on this is that the code suggested for min is correct, this
is the compiler which is wrong: two values with the same type must
have the same representation.
A new headache for implementers...
Jacques Garrigue
The text was updated successfully, but these errors were encountered: