Objective-C Implicit conversion loses integer precision (size_t to CC_Long)

匿名 (未验证) 提交于 2019-12-03 03:04:01

问题:

I have a function that's generating a sha256 encryption of a string,

Here's the function:

    -(NSString*)sha256HashFor:(NSString*)input {     const char* str = [input UTF8String];     unsigned char result[CC_SHA256_DIGEST_LENGTH];     CC_SHA256(str, strlen(str), result);      NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];     for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++)     {         [ret appendFormat:@"%02x",result[i]];     }     return ret; } 

Now this line right here CC_SHA256(str, strlen(str), result); is what's producing this warning (the warning is for the strlen(str) variable).

Implicit conversion loses integer precision: 'size_t' (aka 'unsigned long') to 'CC_LONG' (aka 'unsigned int') 

I'm guessing I just need to convert the strlen(str) to a CC_Long, but I have no idea how to do that.

回答1:

  1. Presumably that's not an error but a warning.

  2. "I just need to convert the strlen(str) to a CC_Long, but I have no idea how to do that." - explicit type conversion (type casting): (CC_LONG)strlen(str), but I don't think you really need this.



回答2:

Speaking from the iOS perspective, the fact that CC_LONG (a.k.a. uint32_t) and size_t (unsigned long) are incompatible sizes can be a security/stability concern in some applications, especially when dealing with reusable library functions.

An MD5 hash is a 128 bit hash of a potentially unlimited length message, so there is a good reason for this warning. If you truncate a length greater than 2^32, you will come up with an incorrect hash.

Your code should logically decide on how large of a string it can support. In this case using CC_MD5, it would have to be 2^32 bytes.

Maximum length for MD5 input/output



回答3:

This code will not show any warning and works perfectly.

- (NSString*) sha256 {     const char * pointer = [self UTF8String];     unsigned char result[CC_SHA256_DIGEST_LENGTH];     CC_SHA256(pointer, (CC_LONG)strlen(pointer), result);      NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];     for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++)     {         [ret appendFormat:@"%02x",result[i]];     }     return ret; } 


回答4:

change your int i to NSUInteger i to silent the warning,



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!