OCaml动态检查行为不当的本机功能

Gre*_*bet 6 c ocaml

是否有可能在运行时检查OCaml中性能不佳的本机函数?这在混合C/OCaml项目中很有用.

在C中实现内部OCaml函数时,必须注意与运行时协调一致.

例如,在以下示例addlibadd故意不使用,CAMLreturn因为这是合适的.

(* foo.ml *)
external add : int -> int -> int = "add";;

Printf.printf "%d\n" (add 4 5);;
Run Code Online (Sandbox Code Playgroud)

和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);
}
Run Code Online (Sandbox Code Playgroud)

如果使用OCaml编译器编译此代码

$ ocamlopt foo.ml libadd.c
$ ocamlc -custom foo.ml libadd.c
Run Code Online (Sandbox Code Playgroud)

然后a.out只是打印9没有抱怨.

./a.out
9
Run Code Online (Sandbox Code Playgroud)

有没有办法让任何一个编译器围绕本机函数调用发出额外的检查,以检查是否已遵守OCaml调用约定?

Pie*_* G. 5

ocaml对此问题没有任何作用,错误依赖于由gcc编译的C代码.并且gcc无法检查返回是否与Ocaml兼容.

可能是限制错误写入C的一种方法,Ocaml重新定义return以避免使用它:

#define return _forbidden_
Run Code Online (Sandbox Code Playgroud)

如果在代码中包含那些定义,那么您的初始C代码将无法编译.

它没有解决问题,但强制用户注意函数返回的方式可能很有用.

另一种方法是使用一个健全性脚本来检查返回类型CAML*不包含任何函数的任何函数return...