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: 4229 Reporter:@alainfrisch Assigned to:@mshinwell Status: resolved (set by @mshinwell on 2017-06-09T15:18:46Z) Resolution: duplicate Priority: normal Severity: minor Target version: later Category: documentation Tags: patch Related to:#4231#4839#6462#6950#6957 Monitored by:@glondu@jmeber "Julien Signoles" monate @dbuenzli@Chris00 ertai
Bug description
Dynlink autorise à charger un module déjà présent dans le programme principal ou déjà dynlinké avant (si sa signature est la même). En particulier, cela permet de redéfinir l'implémentation d'un type abstrait et donc de casser le typage. Certes, il faut vraiment le chercher (cf plus bas).
Une solution un peu moche consisterait à empecher de cacher un symbole global.
Dans symtable.ml:
let slot_for_setglobal id =
if Tbl.mem id !global_table.num_tbl then 0xffff
else enter_numtable global_table id
Original bug ID: 4229
Reporter: @alainfrisch
Assigned to: @mshinwell
Status: resolved (set by @mshinwell on 2017-06-09T15:18:46Z)
Resolution: duplicate
Priority: normal
Severity: minor
Target version: later
Category: documentation
Tags: patch
Related to: #4231 #4839 #6462 #6950 #6957
Monitored by: @glondu @jmeber "Julien Signoles" monate @dbuenzli @Chris00 ertai
Bug description
Dynlink autorise à charger un module déjà présent dans le programme principal ou déjà dynlinké avant (si sa signature est la même). En particulier, cela permet de redéfinir l'implémentation d'un type abstrait et donc de casser le typage. Certes, il faut vraiment le chercher (cf plus bas).
Une solution un peu moche consisterait à empecher de cacher un symbole global.
Dans symtable.ml:
let slot_for_setglobal id =
if Tbl.mem id !global_table.num_tbl then 0xffff
else enter_numtable global_table id
Dans interp.c:
Steps to reproduce
abstract.mli:
type t
val print: t -> unit
val x: t
abstract.ml:
type t = int
let print i = Printf.printf "Abstract %i\n" i
let x = 10
static.ml:
let f = Abstract.print
client.ml:
let () = Static.f Abstract.x
sub/abstract.mli = abstract.ml
sub/abstract.ml:
type t = string
let print i = Printf.printf "Abstract %s\n" i
let x = "foo"
main.ml:let () =
Dynlink.init ();
Dynlink.loadfile "client.cmo"; (* utilise abstract.cmo )
Dynlink.loadfile "sub/abstract.cmo";
Dynlink.loadfile "client.cmo" ( utilise sub/abstract.cmo *)
On compile tout ça...
$ ocamlc -o main dynlink.cma abstract.cmo static.cmo main.cmo
$ ./main
Abstract 10
Abstract 67345600
The text was updated successfully, but these errors were encountered: