Memcpy只会在iPhone 5s上崩溃

所有,

我正面临iPhone 5s的一个奇怪的问题。 我正在使用第三方库在我的应用程序中进行HMAC-SHA1encryption。 该库使用memcpy ,我不知道它是什么,因为我没有在C太多的内存级编程。 encryption工作完全正常,除了64 bit 5s所有手机。 下面是它崩溃的代码(5th line)

 void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len) { unsigned int i, j; j = (context->count[0] >> 3) & 63; if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++; context->count[1] += (len >> 29); if ((j + len) > 63) { memcpy(&context->buffer[j], data, (i = 64-j)); SHA1Transform(context->state, context->buffer); for ( ; i + 63 < len; i += 64) { SHA1Transform(context->state, &data[i]); } j = 0; } else i = 0; memcpy(&context->buffer[j], &data[i], len - i); } 

下面是崩溃细节

exceptiontypes:EXC_BAD_ACCESS(SIGSEGV)exception子types:KERN_INVALID_ADDRESS 0x001a9c799cbfdcf9由线程触发:0

线程0崩溃:0 libsystem_platform.dylib 0x0000000191c34dc8 _platform_memmove + 40 1 Anyvan 0x00000001001fc6a8 SHA1Update(sha1.c:128)2 Anyvan 0x00000001000c7efc hmac_sha1(hmac.c:73)3 Anyvan 0x00000001000fe7cc – [LoginViewController callAuth:](LoginViewController.m:360)

任何帮助将不胜感激。

这是崩溃,因为你使用int不是因为memcpy 。 尝试用NSIntegerreplaceint ,它应该工作。 你可以在这里find更多的信息。

iPhone5S使用64位架构,而其他使用32位。 两者之间的核心差异之一是系统如何处理整数,如文档中所解释的。 你的代码使用的是unsigned int ,这在32位和64位上并不意味着同样的事情,并导致崩溃。 你应该改变你的int i称为ijNSIntegers ,我相信你的代码将工作。 或者来想一想,你可以试着简单地用int代替int这个词。

在为64位平台编译Twitter + OAuth库时,我遇到了同样的问题。 我通过在sha1.h和sha1.c中的7个地方用“uint32_t”replace“unsigned long”来解决这个问题。 喜欢这个:

 #include <stdint.h> typedef struct { uint32_t state[5]; uint32_t count[2]; unsigned char buffer[64]; } SHA1_CTX; 

您还需要包含stdint.h库(在sha1.h的顶部,也许是sha1.c)来完成这个工作。 uint32_t总是32位,我认为SHA1的转换macros如R0在64位数据types上操作失败。 所以改为一个明确的32位数据types修复它。 关于memcpy的回答让我想到了这个解决scheme。

取消对arm64的支持,如果没有那么重要的话。 然后将NO设置为“Build Active Architecture Only”(debugging和发布)

这对我来说是诀窍,我真的不需要我的应用程序的任何64位具体function,所以我把它拿出来。

void CSHA1 :: Update(UINT_8 * data,long len){}

我只是把lenforms的UINT_32改成了long,而且确实有效,现在可以运行在4s,5,5s,6 hah