Ошибка сегментации в Lion, создающем NSData из RubyCocoa с любыми байтами ›127

Следующий RubyCocoa подходит для Max OS X 10.6, но не работает в 10.7.

require 'osx/cocoa'
include OSX
bytes = [128].pack('i1')
NSData.alloc.initWithBytes_length(bytes, bytes.length)

Во всех случаях это работает, когда не установлен верхний бит. Фактически, NSData.alloc, кажется, терпит неудачу, когда передается буфер, в котором для любого из байтов установлен верхний бит.

Версия Ruby - 1.8.7 для обеих ОС, поэтому я не могу понять, почему NSData по-разному интерпретирует буфер. Кто-нибудь может пролить свет?


person Duncan McGregor    schedule 21.07.2011    source источник
comment
Продолжая играть таким образом, я не могу найти ни одного вызова конструктора NSData или NSMutableData, который работает, равно как и CFDataCreate.   -  person Duncan McGregor    schedule 22.07.2011


Ответы (4)


Вам, вероятно, следует перейти на MacRuby, поскольку он заменит RubyCocoa. Возможно, RubyCocoa не работает (и никогда не будет) должным образом работать в Lion.

У меня еще нет опыта MacRuby с Lion, но есть хорошие шансы, что это сработает.

person Koraktor    schedule 21.07.2011
comment
В самом деле, но поскольку у меня есть значительная кодовая база RubyCocoa, а MacRuby все еще не выпущен, я в настоящее время в ужасе. - person Duncan McGregor; 21.07.2011

MacRuby все еще не закончен - он просто не работает с некоторыми кодами Ruby, с которыми я работаю. Я столкнулся с той же проблемой NSData, и мне удалось создать экземпляр CFData, который выглядит нормально со следующим кодом

gem 'RubyInline'
require 'inline'

class CFDataWrapper
  begin 
    inline do |builder|
      builder.include "<CoreFoundation/CoreFoundation.h>"
      builder.c_raw_singleton "

      static VALUE fromString(int argc, VALUE *args){
        CFDataRef d = CFDataCreate(NULL, RSTRING_PTR(args[0]), RSTRING_LEN(args[0]));    

        VALUE result;
        char type = '@';
        ocdata_to_rbobj(Qnil,&type, (const void *)&d, &result, false) ;
        return result;
      }
    "
    end
  end
end
bytes = [128].pack('i1')
data = CFDataWrapper.fromString(bytes)
puts data.inspect

Результат inspect отличается от версии 10.6, но я могу передать его обратно в методы, которые ожидают экземпляры NSData, и они кажутся работающими, вызывают на нем методы NSData и т. Д. Помимо этого игрушечного скрипта он работает со скриптом, который я использую для заполнения основных документов данных, где одна из сущностей имеет атрибут двоичных данных

person Frederick Cheung    schedule 03.08.2011
comment
Спасибо, возможно Lion что-то изменил, что коснулось обоих - person Duncan McGregor; 18.09.2011

Я предполагаю, что проблема на самом деле pack повреждение памяти, потому что она не обрабатывает подписанное переполнение должным образом. Некоторые вещи, которые стоит попробовать, могут привести вас к ответу:

  • попробуйте pack('C1')
  • Выгрузите bytes, сравните с выводом irb.
  • вызвать другую функцию, которая выделяет память сразу после пакета (вообще не используя bytes).
person ergosys    schedule 03.08.2011
comment
Я не думаю, что это пак, так как это стандартный Ruby - person Duncan McGregor; 18.09.2011

Это исправлено в RubyCocoa 1.0.2.

person Duncan McGregor    schedule 18.09.2011