这段代码因Semgentation Fault:11而失败,我不明白为什么

framework 'Cocoa'
framework 'CoreFoundation'
framework 'Security'
* keychainObject = Pointer.new_with_type('^{OpaqueSecKeychainRef}')
SecKeychainOpen("/Users/charbon/Library/Keychains/Josja.keychain",keychainObject)
SecKeychainLock(keychainObject)


我确定它与keychainObject类型有关,因为它可以工作(它会锁定默认的钥匙串)。

SecKeychainLock(nil)


我将'^ {OpaqueSecKeychainRef}'用作指针的类型,因为这是调试器告诉我的,当我使用了错误的指针类型时,这是期望的。

我希望解决该问题将有助于掌握macruby /可可魔术。

供参考,完整的输出为

cobalt:~ charbon$ macirb Desktop/test.rb
irb(main):001:0> framework 'Cocoa'
=> true
irb(main):002:0> framework 'CoreFoundation'
=> true
irb(main):003:0> framework 'Security'
=> true
irb(main):004:0> * keychainObject = Pointer.new_with_type('^{OpaqueSecKeychainRef}')
=> [#<Pointer:0x4007ac200>]
irb(main):005:0> SecKeychainOpen("/Users/charbon/Library/Keychains/Josja.keychain",keychainObject)
=> 0
irb(main):006:0> SecKeychainLock(keychainObject)
Segmentation fault: 11

最佳答案

如果您正在编写C,您可能会写

SecKeychainRef keyChainRef;
SecKeychainOpen("/path/to/...", &keychainRef);
SecKeychainLock(keyChainRef);


即,虽然SecKeychainOpen需要指向SecKeychainRef的指针(以便可以填充输出参数),而其他api仅需要SecKeychainRef,所以您需要取消引用该指针:

framework 'Security'
keychainObject = Pointer.new_with_type('^{OpaqueSecKeychainRef}')
SecKeychainOpen("/Users/charbon/Library/Keychains/Josja.keychain",keychainObject)
SecKeychainLock(keychainObject.value)

08-25 13:44
查看更多