2

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

VALUE method_foo(VALUE self, VALUE key) {

  puts(RSTRING(key)->ptr);

  return key;
}

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

4

2 回答 2

4

您应该考虑调用Check_Type (key, T_STRING)(如果您想引发异常)或使用TYPE (key)手动检查它(如果您想做除了引发异常之外的其他事情)。

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

我可能不会那样做,因为我更喜欢健壮的软件,但有一种观点认为人们不应该总是受到保护,以免自己愚蠢。它只会鼓励他们保持愚蠢:-)

于 2012-08-14T02:43:28.720 回答
1

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

于 2012-08-14T13:06:51.860 回答