OCaml динамически проверяет на плохое поведение нативные функции - PullRequest
0 голосов
/ 03 июня 2018

Можно ли во время выполнения проверять плохо себя вести нативные функции в 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 соблюдено?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Макросы CAML - это просто простые макросы препроцессора.Вы всегда можете просто написать базовый код C напрямую, а не использовать макрос.Ничто, кроме изменения gcc, чтобы узнать, как взаимодействовать с ocaml, исправит это.

Существует один простой трюк для сопоставления макросов в стиле BEGIN и END, но он потерпит неудачу, если один из двух будет случайно забыт.Хитрость заключается в том, чтобы иметь открытие {в макросе BEGIN и закрытие} в макросе END.Забывание одного из них приведет к ошибке, потому что тогда {} не сбалансирован.

Проблема в том, что функция может иметь несколько операторов возврата, что делает использование несбалансированного {} невозможным.

0 голосов
/ 03 июня 2018

ocaml ничего не делает для решения этой проблемы, ошибка связана с кодом C, скомпилированным gcc.И gcc не может проверить, совместимо ли возвращение с Ocaml.

Может быть, один из способов ограничить неправильно написанное C для Ocaml - переопределить return, чтобы избежать его использования:

#define return _forbidden_

Ваш исходный код на C не будет компилироваться, если вы включите те, которые определены в вашем коде.

Это не решает проблему, но может быть полезно заставить пользователя позаботиться о том, как функция должнаreturn.

Другим способом является использование сценария здравомыслия, проверяющего, что любая функция с типом возвращаемого значения CAML* не содержит никаких return ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...