Быстрая проверка неприятной сторонней функции в Haskell (GHC)

Я хотел бы использовать библиотеку быстрой проверки Haskell для тестирования кода C. Кажется, самый простой способ сделать foreign import и написать свойство поверх полученной функции haskell. Проблема в том, что если код C вызывает segfault или ему удается повредить память, мои тесты либо завершаются сбоем без вывода, либо делают что-то совершенно непредсказуемое.

Второй вариант — сделать простые исполняемые обёртки над C-битами и выполнять их вне процесса тестирования через System.Process. Излишне говорить, что для этого требуется много строительных лесов и сериализации значений, но, с другой стороны, он может обрабатывать ошибки сегментации.

Есть ли способ сделать стратегию foreign import такой же безопасной, как запуск внешнего процесса?


person aleator    schedule 08.08.2014    source источник
comment
Я думаю, вы могли бы попытаться сделать исполняемую оболочку в своем текущем процессе, используя System.Posix.Process.forkProcess, и запрограммировать связь с помощью Haskell.   -  person Joachim Breitner    schedule 08.08.2014
comment
@JoachimBreitner Хм .. Хорошая идея. Все еще нужно сериализовать/десериализовать, но, по крайней мере, я могу сделать это в Haskell и без нескольких этапов компиляции.   -  person aleator    schedule 12.08.2014
comment
Если вы не возражаете против хакерского решения, есть libsigsegv[1], который может ловить segfaults и возвращать вас в безопасную точку. Просто установите флаг состояния и выполните getcontext перед входом в настоящую функцию C, а при ошибке переверните флаг и выполните setcontext, чтобы вернуться туда, где вы getcontexted. Если флаг все еще в исходном состоянии, все прошло нормально. Возможно, в сочетании с чем-то вроде cs.rutgers.edu/~santosh.nagarakatte/softbound для некритических ошибок. [1]:libsigsegv — это GPL, но вы не выпускаете свои тесты — или выпускаете? ;-) Если это проблема, у меня есть более простой код, который я могу выпустить.   -  person nobody    schedule 19.09.2014
comment
(Не публиковать это как ответ, так как это почти наверняка не так безопасно, как запуск внешнего процесса.)   -  person nobody    schedule 19.09.2014
comment
Можно ли запустить его под Valgrind? Это не поможет со стороны Haskell, но, надеюсь, устранит эти ошибки памяти.   -  person Lambda Fairy    schedule 01.10.2014
comment
@JoachimBreitner Я думаю, что ваш комментарий послужил бы ответом, если бы вы переместили его вниз, чтобы решить этот официально оставшийся без ответа вопрос :-)   -  person sclv    schedule 20.02.2015


Ответы (1)


Вы можете внедрить оболочку в свой текущий процесс, но затем использовать System.Posix.Process.forkProcess для безопасного запуска в собственном процессе, реализуя необходимую связь с помощью Haskell.

person Joachim Breitner    schedule 20.02.2015
comment
спасибо за указатель; хотите немного расширить? Мне тоже было бы интересно узнать, как это работает. Спасибо - person ocramz; 24.04.2015