Type-safe Unmarshaling for OCaml
>
>http://www.pps.jussieu.fr/~henry/marshal/
>。 The Hump を見て発見した。見てて、 OCaml の Marshal ってそんな type unsafe だっけ? と動作を見てみる。
>
>% ocaml
Objective Caml version 3.08.1
(略)
# (snd v' : float);;
Segmentation fault > >ぐわ。 > >% ocaml
(略)
# fst v' > 1;;
- : bool = true
# fst v' > 2;;
- : bool = true
# fst v' > 2.;;
- : bool = false
# snd v' > 0;;
- : bool = true
# snd v' > 1;;
- : bool = false
# snd v' > 0.;;
Segmentation fault > >ふむふむ。まぁともかく安全さはカケラもないですよと。ここまでだと思わなかった。しかし、まぁ、確かに型クラスのない OCaml では Marshal から戻すときには string -> 'a な型にせざるをえないのだから、そうなるのも当然か。 >
Objective Caml version 3.08.1
# let v = (1.2, 1);;
val v : float * int = (1.2, 1)
# let str = Marshal.to_string v [];;
val str : string =
"\132\149\000\000\000\011\000\000\000\002\000\000\000\006\000\000\000\005\160\012333333\243?A"
# let v' = Marshal.from_string str 0;;
val v' : 'a = <poly>
# fst v';;
- : 'a = <poly>
# (v' : int);;
- : int = 67418276
# (v' : float);;
- : float = 6.43260548697e-314
# (v' : string);;
- : string = "Tq\t\008\003\000\000"
# (fst v' : int);;
- : int = 67418282
# (fst v' : float);;
- : float = 1.2
# (fst v' : string);;
- : string = ""
# (snd v' : string);;
Bus error
>
(略)
# (snd v' : float);;
Segmentation fault > >ぐわ。 > >% ocaml
(略)
# fst v' > 1;;
- : bool = true
# fst v' > 2;;
- : bool = true
# fst v' > 2.;;
- : bool = false
# snd v' > 0;;
- : bool = true
# snd v' > 1;;
- : bool = false
# snd v' > 0.;;
Segmentation fault > >ふむふむ。まぁともかく安全さはカケラもないですよと。ここまでだと思わなかった。しかし、まぁ、確かに型クラスのない OCaml では Marshal から戻すときには string -> 'a な型にせざるをえないのだから、そうなるのも当然か。 >