所有
我正面临着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)
任何帮助都将受到高度赞赏。
答案 0 :(得分:3)
由于您使用int
而不是memcpy
,因此崩溃了。尝试将int
替换为NSInteger
,它应该有效。您可以找到更多信息here。
iPhone5S使用64位架构,而其他使用32位。两者之间的核心差异之一是系统如何处理整数,如文档中所述。您的代码使用的是unsigned int
,这在32位和64位上并不意味着相同的事情会导致崩溃。您应该将int
i
和j
更改为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上运行