Ruby C扩展,如何从分段错误中恢复
我已经编写了一个简单的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)手动检查它(如果您不想引发异常) 或者,您可以
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链接解决了我的确切问题:期望的解决方案。