内容:
我有以下代码将数据加载到BIO中,然后获得一个X509Req:
let reqBIO = BIO_new(BIO_s_mem())
let result = BIO_write(reqBIO, (reqData as NSData).bytes, Int32(reqData.count))
let x509ReqContainer: UnsafeMutablePointer<X509_REQ> = d2i_X509_REQ_bio(reqBIO, nil)
BIO_free(reqBIO)
当输入是预期的base64编码DER时,此代码非常有用。但是,如果我传递base64Encoded垃圾字符串,它会炸毁并且很丑陋,并引发致命错误。
所以我的问题是:
简短版本: d2i_X509_REQ_bio()
无效输入不会“引发错误”。它只是返回一个空指针。崩溃的原因是您(可能是无意间)强行打开了Swift中的可选组件。
较长版本: C函数
X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **x);
在无效输入上返回空指针。此C函数映射为Swift
func d2i_X509_REQ_bio(...) -> UnsafeMutablePointer<X509_REQ>!
使用“隐式展开的可选”(IUO)作为返回类型,并且空指针表示为nil
。IUO几乎等同于“常规”(强)可选,唯一的区别是,如果类型检查器需要,则可以将其强制展开。这就是作业发生的情况
let x509ReqContainer: UnsafeMutablePointer<X509_REQ> = d2i_X509_REQ_bio(reqBIO, nil)
因为该变量被声明为非可选。如果C函数由于输入无效而返回空指针,则Swift将Optional.nil
被解包,并且程序会因运行时错误而终止。
解决方案:将可选绑定与if let
(或guard let
)结合使用,并让编译器自动推断类型:
if let x509ReqContainer = d2i_X509_REQ_bio(reqBIO, nil) {
// success ...
} else {
// failed ...
}
备注:您可以Data
使用
let result = reqData.withUnsafeBytes {
BIO_write(reqBIO, $0.baseAddress, Int32($0.count))
}
而不是将其强制转换为NSData
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句