Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby C扩展,如何从分段错误中恢复_C_Ruby_Ruby C Extension - Fatal编程技术网

Ruby C扩展,如何从分段错误中恢复

Ruby C扩展,如何从分段错误中恢复,c,ruby,ruby-c-extension,C,Ruby,Ruby C Extension,我已经编写了一个简单的Ruby C扩展。方法希望第二个参数是字符串值 VALUE method_foo(VALUE self, VALUE key) { puts(RSTRING(key)->ptr); return key; } 传递整数而不是字符串很容易导致分段错误。我应该如何检测这一点,并在C方法中防止或恢复?您应该研究调用Check\u Type(key,T\u STRING)(如果您希望引发异常)或使用Type(key)手动检查它(如果您不想引发异常) 或者,您可以

我已经编写了一个简单的Ruby C扩展。方法希望第二个参数是字符串值

VALUE method_foo(VALUE self, VALUE key) {

  puts(RSTRING(key)->ptr);

  return key;
}

传递整数而不是字符串很容易导致分段错误。我应该如何检测这一点,并在C方法中防止或恢复?

您应该研究调用
Check\u Type(key,T\u STRING)
(如果您希望引发异常)或使用
Type(key)
手动检查它(如果您不想引发异常)

或者,您可以简单地声明
method\u foo
需要一个字符串,并将其留给调用方处理。毕竟,您的API是调用者和被调用者之间的契约,如果调用者违反规则,它是对崩溃的完全有效的响应


我可能不会这么做,因为我更喜欢健壮的软件,但有一种学派认为,人们不应该总是受到保护,不受自己愚蠢行为的影响。这只会鼓励他们保持愚蠢:-)

StringValuePtr(值)和StringValueCStr(值)执行类型检查并返回字符串指针。顺便说一句,它们是在C扩展中从Ruby字符串中提取char*的公认方法。其中(据我记忆所及),它们都确保返回值不为NULL(在某些情况下可能为NULL),StringValueCStr还确保它是以0结尾的字符串。由于Ruby字符串使用写时复制,因此字符串的一部分可能不会以0结尾。

什么都没有,谢谢您提供的信息。我不能在@Josh上列出这些,它在“作为指针的值”下面,也可以看看你对API的看法是否正确。我的一些“安全”的主要动机是使恶意破坏程序变得更加困难。尽管如此,最好还是让Ruby层清理用户输入。(因为C函数实际上是关于速度的)。我有时是瞎子:-)blogspot链接解决了我的确切问题:期望的解决方案。