2013-06-09 5 views
18

मैं एक समारोह है कि एक तार का एक SHA256 एन्क्रिप्शन पैदा कर रहा है,ऑब्जेक्टिव-सी अंतर्निहित रूपांतरण पूर्णांक परिशुद्धता खो देता है (CC_Long को size_t)

यहाँ समारोह है है:

-(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; 
} 

अब इस लाइन यहीं CC_SHA256(str, strlen(str), result); यह चेतावनी उत्पन्न कर रहा है (चेतावनी स्ट्रेल (स्ट्र) चर के लिए है)।

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

मेरा अनुमान है कि मैं सिर्फ एक CC_Long को strlen (एसटीआर) बदलने की आवश्यकता है, लेकिन मैं कैसे ऐसा करने के लिए पता नहीं है।

+8

'(CC_LONG) strlen (एसटीआर)' – mah

+0

संकलक/toolchain और सेटिंग्स आप किस तरह के प्रयोग कर रहे हैं? यह कुछ ज्यादा pedantic की तरह लगता है। –

+2

वैसे, यह ओएसएक्स या स्वचालित-रेफ-गिनती क्यों टैग की जाएगी ... इनमें से किसी का बिल्कुल शून्य प्रश्न में है। – mah

उत्तर

48
  1. संभवतः यह कोई त्रुटि नहीं है लेकिन एक चेतावनी है।

  2. "मुझे सिर्फ strlen (str) को CC_Long में बदलने की आवश्यकता है, लेकिन मुझे नहीं पता कि यह कैसे करना है।" - स्पष्ट प्रकार रूपांतरण (प्रकार कास्टिंग): (CC_LONG)strlen(str), लेकिन मुझे नहीं लगता कि आपको वास्तव में इसकी आवश्यकता है।

+1

यह वास्तव में एक चेतावनी है ... आपको चेतावनी है कि सिद्धांत में size_t CC_Long से बड़ा हो सकता है ... कहने के लिए एक कलाकार जोड़ें: हाँ मुझे पता है और यह ठीक है –

+0

@ दाईज-दंजन याप, मैं यदि स्ट्रिंग 4 जीबी से अधिक लंबी है (ओएस एक्स 'int' 4 बाइट चौड़ा है) तो इसे या तो असंभव या संभावित रूप से खराब कर दें। –

+0

यह सिर्फ एक चेतावनी थी, हालांकि जब भी मैं इसे चलाता हूं तो मेरा ऐप इस लाइन पर तोड़ रहा है। – garetmckinley

-9

अपने int i चुप करने के लिए NSUInteger i को चेतावनी बदलने के लिए,

1

, आईओएस के नजरिए से बात हो रही है तथ्य यह है कि CC_LONG (उर्फ uint32_t) और size_t (अहस्ताक्षरित लंबे) असंगत आकार एक सुरक्षा/स्थिरता हो सकता है कुछ अनुप्रयोगों में चिंता, खासकर जब पुन: प्रयोज्य पुस्तकालय कार्यों से निपटने।

एक एमडी 5 हैश संभावित असीमित लंबाई संदेश का 128 बिट हैश है, इसलिए इस चेतावनी के लिए एक अच्छा कारण है। यदि आप 2^32 से अधिक लंबाई को छोटा करते हैं, तो आप गलत हैश के साथ आते हैं।

आपके कोड को तर्कसंगत तरीके से तय करना चाहिए कि यह कितनी बड़ी स्ट्रिंग का समर्थन कर सकता है। इस मामले में CC_MD5 का उपयोग करके, इसे 2^32 बाइट्स होना होगा।

Maximum length for MD5 input/output

0

इस कोड को किसी चेतावनी दिखाने के लिए और पूरी तरह से काम करता है नहीं होंगे।

- (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; 
} 
संबंधित मुद्दे