2012-08-14 2 views
2

간단한 Ruby C 확장을 작성했습니다. 메서드는 두 번째 매개 변수가 문자열 ㅎ VALUE가 될 것으로 예상합니다.Ruby C 확장, 분할 오류를 복구하는 방법

VALUE method_foo(VALUE self, VALUE key) { 

    puts(RSTRING(key)->ptr); 

    return key; 
} 

문자열보다는 정수를 전달하여 세분화 오류가 발생하기 쉽습니다. 이를 어떻게 감지하고 C 방법으로 예방하거나 복구해야합니까? 또는 (당신이 예외를 발생보다는 뭔가 다른을 수행하려는 경우) 수동으로 확인 TYPE (key)을 사용 (당신이 발생한 예외를 원하는 경우)

답변

4

당신은 Check_Type (key, T_STRING) 전화로 보일 것입니다.

또는 method_foo은 문자열을 예상하고 처리 할 호출자에게 맡겨 둘 수 있습니다. 결국 API는 발신자와 수신자 간의 계약이며 발신자가 규칙을 어기면 완전히 충돌하는 응답입니다.

나는 강력한 소프트웨어를 선호하기 때문에 그렇게하지 않을 것이지만 사람들이 항상 자신의 어리 석음으로부터 보호되어서는 안된다는 생각이 들게됩니다.

+0

아무 것도 없습니다. 정보를 제공해 주셔서 감사합니다. 나는 이것들 중 하나를 http://ruby-doc.org/docs/ProgrammingRuby/html/ext_ruby.html –

+0

@Josh에 열거 할 수 없었습니다. 그것은 "포인터로서의 가치"에 있습니다 - 또한 http : //를보십시오. /clalance.blogspot.com.au/2011/01/writing-ruby-extensions-in-c-part-4.html – paxdiablo

+0

당신은 API에 대해 옳습니다. 일부 "안전"에 대한 나의 주요 동기는 프로그램을 악의적으로 파괴하는 것을 더 어렵게 만드는 것입니다. 이 방법은 사용자 입력을 깨끗하게 처리하는 루비 계층에 맡기는 것이 좋습니다. (C 함수는 실제로 속도에 관한 것이므로). –

1

StringValuePtr (값) 및 StringValueCStr (값) typechecking을 수행하고 문자열 포인터를 반환합니다. AFAIK, 그들은 C 확장자의 Ruby 문자열에서 char *를 추출하는 허용 된 방법입니다. (내가봤을 때 기억하는 한), 그들은 둘 다 반환 값이 NULL이 아닌지 (어떤 경우 가능할 수 있음) 확인하고, StringValueCStr은 또한 0으로 끝나는 문자열인지 확인합니다. Ruby 문자열은 copy-on-write를 사용하기 때문에 문자열의 일부가 0으로 종료되지 않을 수 있습니다.

관련 문제