Как ввести ошибку сегментации в ruby? - PullRequest
3 голосов
/ 02 апреля 2019

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

Чтобы проверить мой метод, мне нужно внести известную ошибку в сам интерпретатор. Таким образом, я хотел бы ввести ошибку (в частности, seg. Fault) и позволить аварийному завершению работы рубина с правильным (или допустимым входным файлом). Это сег. Ошибка должна возникать из-за интерпретатора и / или mJIT самого Ruby, а не из-за входной программы * .rb, поэтому я предполагаю, что интерпретатор Ruby является источником проблемы, и отладьте ее.

Однако всякий раз, когда я изменяю исходный код и перекомпилирую ruby ​​с помощью $sudo make install, компиляция прерывается с ошибкой ниже:

generating encdb.h
miniruby: io.c:4737: rb_io_fptr_finalize_internal: Assertion `idx < 10' failed.
uncommon.mk:1032: recipe for target 'encdb.h' failed
make: *** [encdb.h] Aborted (core dumped)

Код, добавленный в исходный код, подобен приведенному ниже (это не пример ошибки сегмента):

    int idx;
    idx = rand() % 1000 + 100;
    assert (idx < 10);

Это синтетически правильно и не должно жаловаться во время компиляции, но утверждается во время выполнения.

Я предполагаю, что ruby ​​предварительно компилирует интерпретатор один раз и запускает его с miniruby, а затем, если во время этого запуска возникает какая-либо ошибка, он прерывает всю процедуру компиляции (make).

Я знаю, что это довольно сложная проблема, но кто-нибудь может мне помочь, как обойти эту проблему, скомпилировав с любой модификацией кода, чтобы ввести ошибку?

...