我正在通过C运行一个Ruby脚本,如下所示:

#include <ruby.h>

int main(void) {
  ruby_init();

  int status;
  rb_load_protect(rb_str_new2("./test.rb"), 0, &status);

  if (status) {
    VALUE rbError = rb_funcall(rb_gv_get("$!"), rb_intern("message"), 0);
    printf("%s\n", StringValueCStr(rbError));
  }

  ruby_finalize();
  return status;
}

Ruby 脚本:

1.hello

当我现在运行它时,我得到以下输出:

undefined method `hello' for 1:Integer

这不出所料. 然后,我定义这个方法:

VALUE hello(VALUE self) {
  return Qnil;
}

// just after ruby_init()
rb_define_method(rb_cInteger, "hello", hello, 0);

当我现在运行它时,我得到了

ruby: [BUG] Segmentation fault at 0x00000000000000b0
/* ... */

我该如何处理这个错误呢?在这种情况下,$!是零,但我不知道为什么.

推荐答案

我觉得你只需要把status:

int status = 0;

它看起来像rb_load_protect sets status if there is an exception, but doesn’t set it to zero if there isn’t,但通过将&status传递给它,您可以 suppress 来自编译器的任何单元化变量警告.

目前发生的情况是,status作为一些(非零)垃圾开始,如果没有异常,它不会被设置为零,所以if块总是被执行.但是,如果没有异常,则$!为零,因此在$!上调用message会导致未处理的异常,从而导致崩溃.

C++相关问答推荐

以c格式打印时间戳

在C中使用强制转换将uint16_t转换为uint8_t [2]是否有效?

在C中使用JMP_buf数组进行线程化(在xv6中测试)

当我运行/调试C程序时,Malloc()似乎正在将&q;r\r...&q;赋值给一个指针,我不确定为什么?

为什么我一直收到分段错误?

使用AVX2的英特尔2022编译器的NaN问题&;/fp:FAST

轮询libusb_pollfd struct 列表的正确方式是什么?

为什么数组的最后一个元素丢失了?

等同于铁 rust 的纯C语言S未实现!()宏

C语言中浮点数的取整方式浮点数尾数超过23位时如何取整剩余部分

S,在 struct 中创建匿名静态缓冲区的最佳方式是什么?

C23标准是否向后兼容?

&stdbool.h&q;在嵌入式系统中的使用

为什么GCC不能在 struct 初始值设定项中以sizeof作为条件的三进制中处理复合文字的编译时求值?

模仿 memmove 的行为

根据输入/输出将 C 编译过程分为预处理、编译、汇编和链接步骤

将指针的地址加载到寄存器内联拇指组件中

为什么INT_MIN是在c语言的头文件limits.h中定义的(-INT_MAX-1)而不是直接使用-2147483648

(GNU+Linux) 多个线程同时调用malloc()

C 语言中霍尔分区的快速排序算法