BAD_ACCESS(code = EXC_I386_GPFLT)用ECDSA签名时

我正在尝试在iOS上使用Crypto ++。 我从Marek Kotewicz的GitHub下载了预build版的图书馆。

我正努力从Crypto ++ wiki运行这个示例代码 。

ECDSA<ECP, CryptoPP::SHA256>::PrivateKey privateKey; ECDSA<ECP, CryptoPP::SHA256>::PublicKey publicKey; AutoSeededRandomPool prng, rrng; privateKey.Initialize(prng, CryptoPP::ASN1::secp256k1()); privateKey.MakePublicKey(publicKey); string signature; string message = "Do or do not. There is no try."; StringSource s(message, true, new SignerFilter(rrng, ECDSA<ECP, CryptoPP::SHA256>::Signer(privateKey), new StringSink(signature))); 

它与下面的崩溃。 它出现在Xcode输出窗口中:

 BAD_ACCESS (code=EXC_I386_GPFLT) 

这是C ++文件的memory.h中指向BAD_ACCESS的代码片段

  _LIBCPP_INLINE_VISIBILITY ~auto_ptr() throw() {delete __ptr_;} 

我得到BAD_ACCESS(代码= 1,地址= 0x0)错误指向库的这一行代码

  -> 0x1065dfa8d <+85>: movq -0x58(%rbp), %rdi 

这是调试器的输出

它与下面的崩溃。 它出现在Xcode输出窗口中:

 BAD_ACCESS(code=EXC_I386_GPFLT) 

代码对我来说看起来不错。


我正在尝试在iOS上使用Crypto ++。 我从Marek Kotewicz的GitHub下载了预build版的图书馆。

我只是在黑暗中刺伤。 它假定你上面展示的代码实际上就是你正在做的一个testingViewController

预编译的库似乎在使用GNU的标准C ++库。 我将通过使用-stdlib=c++ (而不是GNU的-stdlib=stdc++ )构buildCrypto ++来切换到LLVM的标准C ++库。 苹果在几年前转向它,而Xcode默认使用它。

您可以在noloader / cryptopp-5.6.2-ios上使用LLVM标准C ++在胖库中findGitHub。

或者,你可以自己build立胖库。 为此,请参阅Crypto ++ wiki上的iOS(命令行) 。 cryptopp-5.6.2-ios的预build库使用这些指令。


 AutoSeededRandomPool prng, rrng; 

你只需要其中的一个。


 StringSource s(message, true, new SignerFilter(rrng, ECDSA<ECP, CryptoPP::SHA256>::Signer(privateKey), new StringSink(signature))); 

多年来,我开始怀疑为这个pipe道创build的临时签署者。 我已经改变了Crypto ++ wiki来停止使用它们。 改用这个代码:

 ECDSA<ECP, CryptoPP::SHA256>::PrivateKey privateKey; ... ECDSA<ECP, CryptoPP::SHA256>::Signer signer(privateKey); ... StringSource s(message, true, new SignerFilter(prng, signer, new StringSink(signature)));