Memcpy仅在iPhone 5s上崩溃

时间:2014-03-17 10:57:10

标签: ios ios7 64-bit

所有

我正面临着iPhone 5s的一个奇怪问题。我正在使用第三方库在我的应用中进行HMAC-SHA1加密。该库使用memcpy,它不知道它是什么,因为我没有在C中进行过多的内存级编程。加密在除64 bit 5s之外的所有iphone中都能正常工作。以下是崩溃(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);
}

以下是崩溃详情

  

异常类型:EXC_BAD_ACCESS(SIGSEGV)   异常子类型: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)

任何帮助都将受到高度赞赏。

4 个答案:

答案 0 :(得分:3)

由于您使用int而不是memcpy,因此崩溃了。尝试将int替换为NSInteger,它应该有效。您可以找到更多信息here

iPhone5S使用64位架构,而其他使用32位。两者之间的核心差异之一是系统如何处理整数,如文档中所述。您的代码使用的是unsigned int,这在32位和64位上并不意味着相同的事情会导致崩溃。您应该将int ij更改为NSIntegers,我相信您的代码可以正常运行。或者考虑一下,您可以尝试简单地将int替换为long

答案 1 :(得分:2)

在为64位平台编译Twitter + OAuth库时,我遇到了同样的问题。我通过替换&#34; unsigned long&#34;来解决它。 by&#34; uint32_t&#34;在sha1.h和sha1.c中的7个地方。像这样:

#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位,我认为在64位数据类型上运行时,SHA1的转换宏如R0会失败。因此,更改为显式32位数据类型可以修复它。关于memcpy的答案让我得到了这个解决方案。

答案 2 :(得分:-1)

如果不重要,请删除对arm64的支持。然后为“仅构建活动体系结构”(调试和发布)

设置NO

这对我有用,我在我的应用程序上并不需要任何64位特定功能,所以我把它拿出来了。

答案 3 :(得分:-1)

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

我刚刚将len形式的UINT_32更改为long,它确实有效,现在可以在4s,5,5s,6 hah上运行