2012-08-14 85 views
2

我写了一个简单的Ruby C扩展。方法期望第二个参数是字符串值。Ruby C扩展,如何从分段错误中恢复

VALUE method_foo(VALUE self, VALUE key) { 

    puts(RSTRING(key)->ptr); 

    return key; 
} 

它很容易通过传递整数而不是字符串来引起分段错误。我应该如何检测这一点,并防止或恢复C方法?

回答

4

你应该看看调用Check_Type (key, T_STRING)(如果你想提出一个例外),或使用TYPE (key)手动检查(如果你想要做的事其他不是抛出一个异常)。

或者,您可以简单地声明method_foo需要一个字符串,并留给调用者处理。毕竟,您的API是调用者和被调用者之间的合同,如果调用者违反了规则,那么这对于崩溃是非常有效的响应。

我可能不会这样做,因为我更喜欢强大的软件,但有一种思想认为人们不应该总是被保护免于自己的愚蠢。它只会鼓励他们保持愚蠢:-)

+0

没有,谢谢你的信息。我无法在http://ruby-doc.org/docs/ProgrammingRuby/html/ext_ruby.html – 2012-08-14 02:48:36

+0

@Josh上列出其中的任何一个,它在“价值作为指针”下面 - 也看看http:/ /clalance.blogspot.com.au/2011/01/writing-ruby-extensions-in-c-part-4.html – paxdiablo 2012-08-14 02:50:12

+0

你是对的API。我对某些“安全”的主要动机是让它难以恶意破坏程序。虽然,这可能更好留给清理用户输入的Ruby层。 (因为无论如何C函数都是关于速度的)。 – 2012-08-14 02:50:54

1

StringValuePtr(value)和StringValueCStr(value)进行类型检查并返回字符串指针。 AFAIK,它们是从C扩展中的Ruby字符串中提取char *的公认方法。在一些事情中(据我所知,当我研究它时),它们都确保返回的值不是NULL(可能在某些情况下),并且StringValueCStr还确保它是以0结尾的字符串。由于Ruby字符串使用copy-on-write,所以字符串的一部分可能不会以0结尾。