Можно ли во время выполнения проверять плохо себя вести нативные функции в OCaml?Это было бы полезно в смешанных проектах C / OCaml.
При реализации встроенной функции OCaml в C необходимо соблюдать осторожность, чтобы жить в гармонии со средой выполнения.
Например, вВ следующем примере add
в libadd
намеренно не использует CAMLreturn
, как это было бы уместно.
(* foo.ml *)
external add : int -> int -> int = "add";;
Printf.printf "%d\n" (add 4 5);;
и исходный файл C
// libadd.c
#include <caml/memory.h>
#include <caml/mlvalues.h>
CAMLprim value
add(value ml_x, value ml_y)
{
CAMLparam2(ml_x, ml_y);
long x = Long_val(ml_x);
long y = Long_val(ml_y);
// intentional mistake here
// don't use CAMLreturn
return Val_long(x + y);
}
Если вы скомпилируете этот код, используялибо компилятор OCaml
$ ocamlopt foo.ml libadd.c
$ ocamlc -custom foo.ml libadd.c
Тогда a.out
просто печатает 9
без жалоб.
./a.out
9
Есть ли способ заставить любой компилятор выдавать дополнительные проверки вокруг вызовов собственных функцийпроверить, что соглашение о вызовах OCaml соблюдено?